导轨5左外连接

时间:2018-03-13 11:01:09

标签: ruby-on-rails postgresql join

需要澄清左外连接。 我有一个名为CLub的模型

class Club < ApplicationRecord
  has_many :club_members, dependent: :destroy
end

另一个名为ClubMember的模型

class ClubMember < ApplicationRecord
  belongs_to :club
end

当我运行像

这样的查询时
Club.left_outer_joins(:club_members)

它给了我来自lett table的所有记录

但有点像

Club.left_outer_joins(:club_members).where('club_members.is_assigned =?',true)

仅返回ClubMember中存在的条目, 我希望它能从左表中返回ClubMember&amp;中不存在的条目。 ClubMember中的现有条目,状态也为TRUE。 只需将ClubMemebr中存在的条目保留为FALSE。

我有错误的概念或做错了什么?

2 个答案:

答案 0 :(得分:2)

LEFT JOIN:

  

LEFT JOIN 会返回左表中的所有行,即使存在   在右表中没有匹配。

这意味着如果ON子句匹配右表中的0(零)记录;连接仍会在结果中返回一行,但右表中的每列都有NULL。

因此,如果我们在右表中的任何列上应用条件。然后它将根据条件返回结果。如果我们想要记录不匹配的记录。我们应该添加一个条件,其中右表也有空值。这就是我在代码中添加的内容。

Club.left_outer_joins(:club_members)
    .where("club_members.is_assigned =true OR club_members.is_assigned is null")

答案 1 :(得分:0)

要返回左边加上巧合,可以添加一个OR。像这样的东西:

Club.left_outer_joins(:club_members).where('club_members.is_assigned =?',true).or(where('condition with the left side'))