2015-08-23 8 views
0

Я создал отношения «многие ко многим», используя has_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 

Из полного списка компонентов, можно выбрать несколько и добавить их к PRODUCT_TYPE , но я должен быть разрешен только добавить их один раз, так что список компонентов для добавления из, должны показывать только компоненты, которые еще не добавлены.

я в настоящее время он работает с 1) список уже добавленных компонентов

@product_type.components 

2) список еще не добавлены те

Component.all - @product_type.components 

Это работает, но я хотел бы для создания области на модели компонентов, чтобы что-то вроде

@product_type.components.addable 

будет генерировать второй список еще не добавленных компонентов.

Возможно ли это? Если да, то каким будет код на модели компонентов? или он будет работать в ProductType? (Я не нашел ничего, что работает) Кроме того, есть ли название для этого списка еще не добавленных компонентов? Будет ли это «правильным внешним соединением»? если нет, то что?

спасибо

ответ

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") } 

Usage будет что-то вроде этого:

Component.addable_to_product_type(@product_type) 
+0

Спасибо за быстрый ответ. Я попробовал, но я получаю эту ошибку SQLite3 :: SQLException: неоднозначное имя столбца: assemblylies.product_type_id: – gkrawiec

+0

Я подозреваю, что вы по-прежнему используете отношение компонентов к объекту типа продукта. Поскольку вы ищете компоненты, у которых нет сборок, Component.addable будет предпочтительнее @ product_type.components.addable –

+0

Правильно, но добавочные компоненты относятся к продукту_типа. Не общий. Каждый product_type имеет список уже добавленных компонентов и собственный личный список добавляемых компонентов. Если я сделаю Component.addable, это даст мне список компонентов, еще не включенных в какой-либо product_type. – gkrawiec