我有这三种型号的
class User < ApplicationRecord
has_many :subscribes
has_many :groups, through: :subscribes
end
class Group < ApplicationRecord
has_many :subscribes
has_many :users, through: :subscribes
end
class Subscribe < ApplicationRecord
belongs_to :user
belongs_to :group
end
我想以一种干净的方式查询用户不在的所有组。我该怎么做?
如果用户具有groups
关联,则表示其具有group_ids
方法
Group.where.not(id: user.group_ids)
而且你也可以显式地提取这样的ids
Group.where.not(id: Subscribe.select(:group_id).where(user_id: user.id))
实现这一点的一种方法是使用;其中";方法。
例如:
Group.where("id NOT IN (?)", user.groups.map(&:id))
这将为您提供用户不在的所有组。
您也可以为此使用子查询:
Group.where("id NOT IN (SELECT group_id FROM subscribes WHERE user_id = ?)", user.id)
这将得到与上一个示例相同的结果,但不使用.map方法。">
您可以找到用户不在的所有组ID,如下所示:
group_ids = Subscribe.where.not(user_id: user.id).uniq
然后通过查询具有以下id的组来查找组记录:
groups = Group.where(id: group_ids)