我有以下表格:
class Contract
has_many :working_days
end
Class WorkingDay
belongs_to :contract
end
working_days
表中有一个date
字段
我还有一个日期数组,例如:
dates_array = [Date.today, Date.today + 1.week, Date.today + 2.weeks, Date.today + 3.weeks, Date.today + 4.weeks]
尽可能快,并在一个Activerecord或SQL查询,我怎么能返回所有合同有一个工作日的所有的dates
数组内的日期?
我希望这是尽可能快的,所以我不想循环日期数组和运行多个查询。
如果可以从dates_array
中map
可以在Activerecord查询中运行的SQL查询,那就可以了。比如:
Contract.joins(:working_days).where(working_days: dates_array.map { |date| "('date=?','#{date}') #{'OR' unless date == dates_array.last}" }.join(''))
但是这段代码不起作用,而且到目前为止,除了循环遍历日期数组(太慢了)之外,我还没能想出任何能起作用的东西。
在一个查询中,有人知道我如何返回所有合同,有一个工作日的所有日期数组内的日期?
感谢任何可以帮助你的人!
您可以获得所有具有working_days的合同记录,其中working_days与dates_array
保存的日期完全相同,其中working_days的总数与dates_array
中的元素数量完全相同,同时按id对合同行进行分组:
Contract
.joins(:working_days)
.where(working_days: { date: dates_array })
.group(:id)
.having('COUNT(*) = ?', dates_array.size)