如何在rails中简单地加入n-to-n关联?

时间:2016-07-28 19:26:40

标签: sql ruby-on-rails ruby postgresql activerecord

我有三个表:userslocationslocations_users,关联如下:

user has_many locations_users
user has_many locations :through => locations_users

location has_many locations_users
location has_many users :through => locations_users

如何在一个查询中找到加入location_id = 5的所有用户?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用LEFT OUTER JOIN。它从左表中获取所有数据,右边是匹配数据,如果存在(如果不存在,则连接列为空):

User
  .joins('LEFT OUTER JOIN locations_users ON locations_users.user_id = users.id')
  .where('locations_users.id IS NULL OR locations_users.location_id = ?', 5)
  .all

Hovewer:

  • 此查询使用join,其性能在大表上可能较差(可能两个查询执行速度更快 - 测试它!)
  • 为了获得更好的性能,请确保在已连接的列上设置索引

答案 1 :(得分:1)

我不知道1种查询方式,但下面的解决方案是有效的。

a = User.where("id NOT IN (?)", LocationUser.pluck("DISTINCT user_id"))
b = LocationUser.where(location_id: 5).pluck("DISTINCT user_id")
result = User.where(id: a+b)