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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top