如何创建尚未处于多对多关系中的元素范围?
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)
我使用 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)