Rails 4 中是否可以向 LEFT OUTER JOIN 添加条件?

MZB*_*MZB 5 ruby-on-rails ruby-on-rails-4 rails-activerecord

鉴于此结构:

class Account < ActiveRecord::Base
    has_many :users
    has_many :teams
    validates :name, presence: true
end

class User < ActiveRecord::Base
    belongs_to :account
    has_and_belongs_to_many :teams
    validates :name, presence: true
end

class Team < ActiveRecord::Base
    belongs_to :account
    has_and_belongs_to_many :users
    validates :name, presence: true
end
Run Code Online (Sandbox Code Playgroud)

目标是获取帐户的所有团队 ID/名称的列表/数组,以及指示给定用户是否属于该团队的标志。

在 SQL 中我可以通过以下方式得到这个结果:

SELECT teams.id, teams.name, 
     teams_users.team_id IS NOT NULL AS member FROM teams 
    LEFT OUTER JOIN teams_users ON 
        (teams.id = teams_users.team_id AND team_users.user_id = ?)
    WHERE teams.account_id = ?
Run Code Online (Sandbox Code Playgroud)

有Rails 4 / ActiveRecord 方法可以获得相同的结果吗?我所做的每一次尝试都将teams_users.user_id = ?条件推入 WHERE 子句中,该子句仅返回用户所属团队的列表,而不是与该帐户关联的所有团队。

mes*_*jah 6

字符串形式应该是可以的joins。在插入字符串之前清理任何用户输入。

Team.select(:id, :name).
  select("teams_users.team_id IS NOT NULL AS member FROM teams").
  joins("LEFT OUTER JOIN teams_users ON (teams.id = teams_users.team_id AND team_users.user_id = #{current_user.id})").
  where(account_id: account.id)
Run Code Online (Sandbox Code Playgroud)