如何保留带条件的外连接

fla*_*oke 6 join ruby-on-rails

我有这样的关系:

class Action < ApplicationRecord
   has_many :actions_users
Run Code Online (Sandbox Code Playgroud)

我尝试进行如下查询:

select *
from actions left outer join actions_users
on actions_users.action_id = actions.id and actions_users.user_id = 1
where actions.user_id = 1
Run Code Online (Sandbox Code Playgroud)

同时,根据我的经验,在我尝试过的所有结果中,

select *
from actions left outer join actions_users
on actions_users.action_id = actions.id
where actions.user_id = 1 and actions_users.user_id = 1 
Run Code Online (Sandbox Code Playgroud)

连接条件代码和一般条件已where生效。

我怎样才能解决它?

Joh*_*ker -3

因为你的条件一般where,所以可以使用includes。这将生成一个LEFT OUTER JOIN查询:

Action.includes(:actions_users).where(actions_users: { user_id: true })
Run Code Online (Sandbox Code Playgroud)

或者如果您正在使用Rails 5+,Active Record 提供了一个查找方法left_outer_joins

Action.left_outer_joins(:actions_users).where(actions_users: { user_id: true })
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会将条件添加到“LEFT JOIN”,而是将其添加到“WHERE”。它们有时会产生_非常_不同的结果。为了将条件添加到“LEFT JOIN”,我必须使用“.joins(“...”)”编写自定义 JOIN。我还找到了另一种方法,可以将其添加到“has_many”关联中,但我发现不太直观。 (3认同)