[英]Rails query: Where association is the parent's first associated record?
我的工作有很多发票,发票属于工作。 我想查询第一张发票落在日期范围之间的作业。 我有这个问题:
@jobs = Job.joins(:invoices).
where("invoices.date BETWEEN ? AND ?", @from_date, @to_date).
where("invoices = job.invoices.first")
第二个where子句是伪代码,但它让你知道我想要做什么。
如果重要的话,我正在使用MYSQL。
我的查询将是:
@jobs = Job.where("
id IN (
SELECT T1.job_id
FROM invoices as T1 JOIN (
SELECT job_id, MIN(id) AS first_id
FROM invoices
GROUP BY job_id
) as T0 ON T1.id = T0.first_id
WHERE T1.date > ? AND T1.date < ?
)
", @from_date, @to_date)
说明:
使用Rails执行此操作的最简单方法是添加范围,如下所示:
has_one :first_invoice, -> { order('created_at DESC') }, class_name: 'Invoice'
然后你可以这样做:
@jobs = Job.joins(:first_invoice).where("invoices.date BETWEEN ? AND ?", @from_date, @to_date)
编辑 - 这实际上不起作用。 第一个发票范围适用于作业实例以获取其第一个发票,但在加入时不起作用。
另一种方法 - 您可以向Job添加一列并存储first_invoice_date
(并将其编入索引)。 查询,排序,组合范围,显示第一个发票日期等变得容易多了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.