【问题标题】:Activerecord - Return all records with children for every date within an array of dates?Activerecord - 返回日期数组中每个日期的所有子记录?
【发布时间】:2021-10-02 15:54:42
【问题描述】:

我有以下表格:

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_arraymap 一个SQL 查询可以在Activerecord 查询中运行,那就没问题了。比如:

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

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

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

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

【问题讨论】:

    标签: mysql sql ruby-on-rails activerecord rails-activerecord


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多