ruby-on-rails 有多个通过查询使用的日期

vsnjm48y  于 2023-03-13  发布在  Ruby
关注(0)|答案(1)|浏览(119)

我试图使用has_many:through关系中的值来检索Authors列表,但我的逻辑失败了。
实现这一目标的最佳方法是什么
当前正在尝试此操作,但未成功

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)

但要使上面的查询正常工作

0md85ypi

0md85ypi1#

您的查询可能会失败,因为您使用的是带有SQL字符串片段的includes。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 } })

如果您只是尝试过滤到author列表,而根本不需要book,我建议使用子查询:

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

相关问题