首页 > 解决方案 > Activerecord - 返回日期数组中每个日期的所有子记录?

问题描述

我有以下表格:

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

我希望这尽可能快,所以我不想遍历日期数组并运行多个查询。

如果可以在 Activerecord 查询中运行mapSQL 查询,那就没问题了。dates_array就像是:

Contract.joins(:working_days).where(working_days: dates_array.map { |date| "('date=?','#{date}') #{'OR' unless date == dates_array.last}" }.join(''))

但是这段代码不起作用,到目前为止,除了循环遍历日期数组(太慢)之外,我还没有想出任何可以做的事情。

在一个查询中,有谁知道我如何返回日期数组中所有日期都有工作日的所有合同?

感谢任何可以提供帮助的人!

标签: mysqlsqlruby-on-railsactiverecordrails-activerecord

解决方案


您可以获得所有具有 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)

推荐阅读