如何创建尚未处于多对多关系中的元素范围?

how to create a scope of elements not yet in many to many relationship?

我使用 has_many :through join table.

创建了一个 "many to many" 关系
class ProductType < ActiveRecord::Base
  has_many :assemblies
  has_many :components, through: :assemblies
end

class Assembly < ActiveRecord::Base
  belongs_to :product_type
  belongs_to :component
end

class Component < ActiveRecord::Base
  has_many :assemblies
  has_many :product_types, through: :assemblies
end

从完整的组件列表中,我可以 select 一些并将它们添加到 product_type 但我应该只允许添加它们一次,所以要添加的组件列表应该只显示尚未添加的组件。

我目前正在使用它 1) 已经添加的组件列表

@product_type.components

2) 未添加列表

Component.all - @product_type.components

这可行,但是,我想在组件模型上创建一个范围,以便像

@product_type.components.addable

将生成第二个尚未添加的组件列表。

这可能吗?如果是,组件模型上的代码是什么?或者它会进入 ProductType 吗? (我还没有找到任何有用的东西) 另外,这个尚未添加的组件列表是否有名称?会是 "right outer join" 吗?如果不是,那是什么?

谢谢

绝对有可能。下面是一个片段,显示了应该添加到组件模型的范围

scope :addable_to_product_type, -> (product_type) { joins("LEFT JOIN assemblies ON assemblies.component_id = components.id AND assemblies.product_type_id = #{product_type.id}").where("assemblies.component_id IS NULL") }

用法是这样的:

Component.addable_to_product_type(@product_type)