【发布时间】:2017-05-22 19:04:32
【问题描述】:
我有一张有很多预订的餐厅表。现在我想查询所有餐厅,如果他们有 2 人的预订,它应该预加载这些关联。如果 2 没有预订,它仍应返回餐厅,但关联为空。
为此,我尝试了以下查询:
Restaurant.eager_load(:reservations).where("number_of_people = ?", 2)
但是,这不起作用,因为它会丢弃所有有预订但没有一个是 2 人的餐厅。
所以我想做的是将该条件移动到连接条件中。比如:
Restaurant.joins('LEFT OUTER JOIN \"reservations\" ON \"reservations\".\"restaurant_id\" = \"restaurants\".\"id\" AND \"reservations\".\"number_of_people\" = ?', 2)
这将给出我需要的结果,但是这不是预加载“保留”关联,而是导致 N+1 问题。
eager_load 似乎不接受自定义查询。我找到了这些线程:https://github.com/rails/rails/issues/12270 和 JOIN ON ... AND conditions when eager loading association in ActiveRecord,但没有提供解决方案。
【问题讨论】:
-
你可以用
includes代替joins -
includes也不接受自定义 SQL -
您需要创建一个与条件的新关联
标签: ruby-on-rails activerecord eager-loading