Rails 3有很多通过查询所有父记录,只包括满足条件的子项

时间:2013-09-01 19:08:53

标签: sql ruby-on-rails ruby-on-rails-3 activerecord eager-loading

我有一种关系,餐馆可以通过名为“行动”的中间表拥有许多用户,而用户也可以通过操作来拥有许多餐馆。

我正在尝试查询所有餐馆,只包括符合特定条件的用户;无论是否有符合搜索条件的用户,或者根本没有与之关联的用户,都应该退回餐厅。我的模型如下。

餐厅模特:

has_many :actions
has_many :users, through: :actions

动作模型:

belongs_to :user
belongs_to :restaurant

用户模型:

has_many :actions
has_many :restaurants, through: :actions

1 个答案:

答案 0 :(得分:0)

这种情况需要做的是使用左外连接。如果您只是创建联接以查找具有特定属性的用户,例如:

   Restaurant.joins(:users).where("users.name LIKE 'user_name'")

隐式创建了一个内部联接,这将忽略所有没有用户的餐馆。要包含它们,请执行以下操作:

Restaurant.joins(["LEFT OUTER JOIN actions on restaurants.id = actions.user_id", "LEFT OUTER JOIN users on users.id = actions.user_id"]).where("users.name LIKE 'James' OR users.name IS NULL ")