我使用has_many:through join table创建了“多对多”关系。
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
从完整的组件列表中,我可以选择一些并将它们添加到product_type中 但我应该只允许添加一次,因此要添加的组件列表应该只显示尚未添加的组件。
我目前正在使用它 1)已添加组件的列表
@product_type.components
2)尚未添加的列表
Component.all - @product_type.components
这样可行,但是,我想在组件模型上创建一个范围,以便像
那样@product_type.components.addable
会生成第二个尚未添加的组件列表。
这可能吗?如果是,那么组件模型上的代码是什么?或者它会进入ProductType? (我还没找到任何有用的东西) 此外,这个尚未添加的组件列表是否有名称?它会是一个“正确的外部联盟”吗?如果没有,那是什么?
感谢
答案 0 :(得分:0)
绝对有可能。下面是一个片段,显示了应该添加到组件模型的范围
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)