我有一种关系,餐馆可以通过名为“行动”的中间表拥有许多用户,而用户也可以通过操作来拥有许多餐馆。
我正在尝试查询所有餐馆,只包括符合特定条件的用户;无论是否有符合搜索条件的用户,或者根本没有与之关联的用户,都应该退回餐厅。我的模型如下。
餐厅模特:
has_many :actions
has_many :users, through: :actions
动作模型:
belongs_to :user
belongs_to :restaurant
用户模型:
has_many :actions
has_many :restaurants, through: :actions
答案 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 ")