在Rails ActiveRecord中查找where.not.any的正确查询

时间:2018-01-25 21:40:31

标签: mysql ruby-on-rails activerecord

初学者问题。
我有一个用户表和一个团队表。

用户有很多团队,团队属于用户。

我想查询用户是否没有团队。 我正在使用此查询:

    User.joins(:teams).where.not(teams: {team_name: 'coconuts'})

除非用户拥有多个团队,否则此方法有效 例如,用户账单上有椰子团队和面包果团队 上面的查询会在他应该被排除时返回Bill,因为他在椰子团队中。

我知道为什么会发生这种情况,但我很难想到另一个适用于这种情况的查询。
获取此数据的正确方法是什么? 我使用的是Rails 4。

2 个答案:

答案 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')
}