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 的用户
您可以左联接 users
和 contacts
,按 users.id
列对行进行分组,过滤没有主要联系人的组(使用 count
和 case
语句)和 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")
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 的用户
您可以左联接 users
和 contacts
,按 users.id
列对行进行分组,过滤没有主要联系人的组(使用 count
和 case
语句)和 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")