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

时间:2015-08-23 00:16:51

标签: ruby-on-rails-4 arel

我使用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? (我还没找到任何有用的东西) 此外,这个尚未添加的组件列表是否有名称?它会是一个“正确的外部联盟”吗?如果没有,那是什么?

感谢

1 个答案:

答案 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)