给定这样的情况:
Company
has_many Users
要获得拥有 3 个用户的公司,此方法有效:
Company.joins(:users).group("companies.id").having("COUNT(users.id)=3")
但是获得拥有 0 个用户(无)的公司的最有效方法是什么?因为,显然,同样的方法行不通(因为
joins
根据定义不包括拥有 0 用户的公司):
Company.joins(:users).group("companies.id").having("COUNT(users.id)=0")
执行 LEFT JOIN 而不是 INNER JOIN。
Company.joins('LEFT OUTER JOIN users ON companies.id = users.company_id')
随着 Rails 的不断发展,现在也可以在没有显式 SQL 的情况下进行表述。
此外,使用外部联接和 null user.id 上的 where 可以更轻松地搜索没有用户的公司:
Company.left_outer_joins(:users).where(users: {id: nil})