Ruby on rails 如何在多对多Rails中查找未选中的项目4

Ruby on rails 如何在多对多Rails中查找未选中的项目4,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我有以下数据库结构 class Category < ActiveRecord::Base has_many :member_categories has_many :members, :through => :member_categories end class Member < ActiveRecord::Base has_many :member_categories has_many :categories, :through => :memb

我有以下数据库结构

class Category < ActiveRecord::Base
  has_many :member_categories
  has_many :members, :through => :member_categories
end

class Member < ActiveRecord::Base
  has_many :member_categories
  has_many :categories, :through => :member_categories
end

class MemberCategory < ActiveRecord::Base
  self.table_name = "member_categories"
  belongs_to :member
  belongs_to :category
end
在那里我找到分配给该成员的类别。我需要选择未分配给成员的类别。如何编写范围来实现这一点


请提前告知,谢谢。

这不是一个合适的工作范围。只需编写一个方法来查找ID不在与给定成员关联的类别ID集中的所有类别:

class Member
  has_many :member_categories
  has_many :categories, through: :member_categories

  def not_categories
    Category.where('id not in (?)', categories.pluck(:id))
  end
end

这个解决方案很有效。谢谢,但有两个查询正在控制台中运行,我们可以避免吗?第一个选择成员类别,第二个选择不在条件中的类别可能通过
Category.where('id not in(?)、categories.to_sql)
,但为什么要麻烦呢?这很简单,清晰,效果很好。您可以将查询构建为嵌套的
select。。。其中id不在(选择…
),但我不会为额外的工作而烦恼,除非这实际上证明是一个性能瓶颈。只是为了避免数据库交互。不管怎样,非常感谢它奏效了。@meager我刚刚编辑了答案。正如在
categories.pull(:id)
返回null时所注意到的,pull将始终返回一个包含0个或更多项的数组。它永远不会是
nil?
class Member
  has_many :member_categories
  has_many :categories, through: :member_categories

  def not_categories
    Category.where('id not in (?)', categories.pluck(:id))
  end
end