有许多使用日期的through查询



我试图使用从一个has_many:through关系的值来检索作者列表,但我的逻辑是失败的。

实现这一目标的最佳方法是什么

当前尝试此操作未成功

start_date = '01/01/0001'.to_date.beginning_of_day
end_date = '01/01/2020'.to_date.end_of_day
Author.includes(:books).where("date(books.release_date) BETWEEN ? AND ?", start_date, end_date)

我可以通过

检索这些书
Book.where("date(release_date) BETWEEN ? AND ?", start_date, end_date)

但是想让上面的查询工作

您的查询可能会失败,因为您正在使用includes与SQL字符串片段。Rails不使用SQL字符串推断includes上的任何关联,因此引用必须结合使用:

Author.includes(:books).references(:books).where("date(books.release_date) BETWEEN ? AND ?", start_date, end_date)

或者,您可以使用查询DSL来构造相同的where子句,Rails将能够推断出关联:

Author.includes(:books).where({ books: { release_date: 1.year.ago..Time.now } })

如果您只是试图过滤到authors列表,并且根本不需要books,我建议使用子查询:

author_ids = Book.where("date(release_date) BETWEEN ? AND ?", start_date, end_date).select(:author_id)
Author.where(id: author_ids)

最新更新