mysql - 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 查询中运行map
SQL 查询,那就没问题了。dates_array
就像是:
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)
推荐阅读
- javascript - Socket IO + React - '欢迎消息
- javascript - 无法读取 vue-chartjs 中未定义的属性“reactiveProp”
- php - PHP - 将值添加到已经存在的数组
- tensorflow - Autokeras:元组索引超出范围
- c - 获取堆栈错误:0 [main] stringL 1123 cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 stringL.exe.stackdump
- node.js - Puppeteer 文件选择器
- android - 如果 Google Pay 在您的国家/地区不可用,如何将信用卡付款添加到 Android 应用程序?
- android - 两个移动设备上的Android AudioRecorder读取方法问题1)Redmi note 5 pro 2)三星m10s
- rx-java - rxJava 的 API 是如何工作的
- android - png 文件将被flutter的发布版本破坏