初学者问题。
我有一个用户表和一个团队表。
用户有很多团队,团队属于用户。
我想查询用户是否没有团队。 我正在使用此查询:
User.joins(:teams).where.not(teams: {team_name: 'coconuts'})
除非用户拥有多个团队,否则此方法有效 例如,用户账单上有椰子团队和面包果团队 上面的查询会在他应该被排除时返回Bill,因为他在椰子团队中。
我知道为什么会发生这种情况,但我很难想到另一个适用于这种情况的查询。
获取此数据的正确方法是什么?
我使用的是Rails 4。
答案 0 :(得分:2)
请尝试以下操作,请考虑simple and clean code
vs performance
:
team = Team.find_by(name: 'coconuts')
excluded_user_ids = team.user_ids
User.where.not(id: excluded_user_ids)
# If you want more a little bit efficiently and suppose you have the join model `Membership`
excluded_user_ids = team.memberships.pluck(:user_id)
# Or if you want more efficiently (just 1 query) and suppose you're using Postgresql
User
.left_outer_joins(:teams)
.group('users.id')
.select("users.*, count(teams.id) AS count_foo, count(teams.id) filter (where teams.name = 'coconuts') AS count_bar")
.having('count_foo != count_bar')
答案 1 :(得分:1)
只使用Ruby,而不是活动记录,你可以
User.select {|user| user.teams.pluck(:team_name).exclude?('coconuts')
}