Rails:没有关联记录或 none 由特定条件创建的关联记录

Rails: Either no associated records OR none of the associated records created by aspecific condition

class User
   has_many :contacts
end

class Contact
   belongs_to :user
   # id
   # contact_type -> ['main', 'work', 'home']
end

仅获取那些没有任何联系方式或如果他们有联系方式的用户的最简洁方法是什么,那么 contact_type 值的 none 是 main

示例:

User: id: 1, name: 'Dev'
Contacts: []

User: id: 2, name: 'Mike'
Contacts: [
  id: 1, contact_type: 'work'
  id: 2, contact_type: 'main'
]

User: id: 3, name: 'John'
Contacts: [
  id: 3, contact_type: 'work'
  id: 4, contact_type: 'home'
]

结果: 应该 return id 为 1 和 3 的用户

您可以左联接 userscontacts,按 users.id 列对行进行分组,过滤没有主要联系人的组(使用 countcase 语句)和 select 来自 users table.

的列

如果您使用的是 Rails 5+,则可以使用 left_outer_joins

User
  .left_outer_joins(:contacts)
  .group('users.id')
  .having("count(case when contact_type = 'main' then 1 end) = 0")

在旧版本中,您可以将 SQL 片段传递给 joins 方法以执行左连接。

 User
   .joins('left join contacts on contacts.user_id = users.id')
   .group('users.id')
   .having("count(case when contact_type = 'main' then 1 end) = 0")

SQL fiddle