需要澄清左外连接。 我有一个名为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。
我有错误的概念或做错了什么?
答案 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'))