Wie funktioniert has_one: durch Arbeit?
-
01-07-2019 - |
Frage
Ich habe drei Modelle:
class ReleaseItem < ActiveRecord::Base
has_many :pack_release_items
has_one :pack, :through => :pack_release_items
end
class Pack < ActiveRecord::Base
has_many :pack_release_items
has_many :release_items, :through=>:pack_release_items
end
class PackReleaseItem < ActiveRecord::Base
belongs_to :pack
belongs_to :release_item
end
Das Problem ist, dass während der Ausführung, wenn ich eine Packung zu einem release_item hinzufügen es nicht bewusst ist, dass die Packung eine Packung ist. Zum Beispiel:
Loading development environment (Rails 2.1.0)
>> item = ReleaseItem.new(:filename=>'MAESTRO.TXT')
=> #<ReleaseItem id: nil, filename: "MAESTRO.TXT", created_by: nil, title: nil, sauce_author: nil, sauce_group: nil, sauce_comment: nil, filedate: nil, filesize: nil, created_at: nil, updated_at: nil, content: nil>
>> pack = Pack.new(:filename=>'legion01.zip', :year=>1998)
=> #<Pack id: nil, filename: "legion01.zip", created_by: nil, filesize: nil, items: nil, year: 1998, month: nil, filedate: nil, created_at: nil, updated_at: nil>
>> item.pack = pack
=> #<Pack id: nil, filename: "legion01.zip", created_by: nil, filesize: nil, items: nil, year: 1998, month: nil, filedate: nil, created_at: nil, updated_at: nil>
>> item.pack.filename
NoMethodError: undefined method `filename' for #<Class:0x2196318>
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/base.rb:1667:in `method_missing_without_paginate'
from /usr/local/lib/ruby/gems/1.8/gems/mislav-will_paginate-2.3.3/lib/will_paginate/finder.rb:164:in `method_missing'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_collection.rb:285:in `send'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_collection.rb:285:in `method_missing_without_paginate'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/base.rb:1852:in `with_scope'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_proxy.rb:168:in `send'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_proxy.rb:168:in `with_scope'
from /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_collection.rb:281:in `method_missing_without_paginate'
from /usr/local/lib/ruby/gems/1.8/gems/mislav-will_paginate-2.3.3/lib/will_paginate/finder.rb:164:in `method_missing'
from (irb):5
>>
Es scheint, dass ich Zugang zu item.pack haben sollte, aber es ist nicht bewusst, dass die Packung eine Packung Artikel ist.
Lösung
Es scheint, dass Ihre Benutzung has_one: durch die richtige ist. Das Problem, das Sie sehen, hat mit Spar Objekten zu tun. Für eine Vereinigung zu arbeiten, dass das Objekt referenziert wird benötigt eine ID hat, um das model_id
Feld für das Objekt zu füllen. In diesem Fall hat PackReleaseItems
ein pack_id
und ein release_item_id
Feld, das für die Verbindung gefüllt werden muß, um korrekt zu arbeiten. Versuchen Sie speichern, bevor Objekte durch eine Assoziation erreichbar.
Andere Tipps
Ihr Problem ist, wie Sie die ReleaseItem
und die Pack
sind zugeordnet wird.
has_many :through
und beide has_one :through
Arbeit durch ein Objekt, den Tisch fungiert als auch beitreten, in diesem Fall PackReleaseItem
. Da diese Tabelle nicht nur ein Join ist (wenn es, sollten Sie nur has_many
ohne :through
verwenden), die Schaffung richtig der Verein das Objekt verbinden erfordert die Schaffung, etwa so:
>> item.pack_release_items.create :pack => pack
Was Sie mit Ihrem item.pack = pack
Anruf tun einfach ist, die Objekte im Speicher zugeordnet wird. Wenn Sie gehen, um es wieder zu sehen, es sieht „through
“ die pack_release_items
, die leer ist.
Sie wollen (statt neu) das Element und Pack speichern oder zu erstellen. Ansonsten hat sich die Datenbank nicht IDs für den Verein zugeordnet.