2016-07-11 10 views
2

ich zwei Modelle, die gerade haben, List und Item:Ruby on Rails Join-Tabelle mit Menge

class List < ApplicationRecord 
    has_and_belongs_to_many :items 
end 

class Item < ApplicationRecord 
    has_and_belongs_to_many :lists 
end 

Jede Liste has_and_belongs_to_many Elemente und jedes Element has_and_belongs_to_many Listen durch die items_lists Tisch kommen.

Derzeit kann ich Elemente zur Liste hinzufügen, mit dem folgenden Code:

list.items.new(id: item.id) 

Dies funktioniert gut, aber ich mag eine Menge des Artikels angeben, wenn es in die Liste aufgenommen wird.

Also, in der Join-Tabelle, fügte ich eine weitere Spalte namens quantity, die eine Menge speichern sollte, die zeigt, wie viele der Artikel benötigt wird. Nach dem Hinzufügen der Menge Spalte habe ich versucht, den folgenden Code die Menge zusammen mit einem Element zu speichern:

list.items.new(id: item.id, quantity: 3) 

Allerdings habe ich eine Fehlermeldung erhalten, die ActiveModel::UnknownAttributeError: unknown attribute 'quantity' for Item.

sagte Da die Art, wie ich falsch zu sein versucht, erscheint, Was sollte getan werden, damit eine Anzahl von Artikeln zu einer Liste hinzugefügt werden kann?

Antwort

3

müssen Sie eine has many through Beziehung anstelle der has and belongs to many verwenden. Dazu müssen Sie die Beziehungen zu Ihren beiden vorhandenen Modellen ändern und eine dritte erstellen. Sie wollen diese Beziehung für die many-to-many verwenden, da Sie speichern Daten zusätzlich zu den beiden Rekordprimärschlüssel (has_many_through Dokumentation)

class List < ApplicationRecord 
    has_many :items_lists 
    has_many :items, through: :items_lists 
end 

class Item < ApplicationRecord 
    has_many :items_lists 
    has_many :lists, through: :items_lists 
end 

class ItemsList < ApplicationRecord 
    belongs_to :item 
    belongs_to :list 
end 

zusätzlich Ihre items_lists Tabelle einen list_id und eine item_id haben sollte. so würden Sie am Ende

list.items.new(item_id: item.id, quantity: 3) 
anrufen