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