Domanda

Ho tre modelli:

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

Il problema è che, durante l'esecuzione, se aggiungo un pack a release_item non si accorge che il pack è un pack.Ad esempio:

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
>> 

Sembra che dovrei avere accesso a item.pack, ma non è a conoscenza del fatto che il pacchetto sia un elemento del pacchetto.

È stato utile?

Soluzione

Sembra che l'utilizzo di has_one :through sia corretto.Il problema che stai riscontrando ha a che fare con il salvataggio degli oggetti.Affinché un'associazione funzioni, l'oggetto a cui si fa riferimento deve avere un ID per popolare il file model_id campo per l'oggetto.In questo caso, PackReleaseItems avere un pack_id e un release_item_id campo che è necessario compilare affinché l'associazione funzioni correttamente.Prova a salvare prima di accedere agli oggetti tramite un'associazione.

Altri suggerimenti

Il tuo problema è nel modo in cui stai associando il file ReleaseItem e il Pack.

has_many :through E has_one :through entrambi funzionano attraverso un oggetto che funge anche da tabella di join, in questo caso PackReleaseItem.Poiché questa non è solo una tabella di join (se lo fosse, dovresti semplicemente usare has_many senza :through), la creazione corretta dell'associazione richiede la creazione dell'oggetto join, in questo modo:

>> item.pack_release_items.create :pack => pack

Cosa stai facendo con il tuo item.pack = pack La chiamata consiste semplicemente nell'associare gli oggetti in memoria.Quando vai a cercarlo di nuovo, sembra "through" IL pack_release_items, che è vuoto.

Vuoi salvare o creare (invece di crearne uno nuovo) l'articolo e il pacchetto.Altrimenti, il database non ha assegnato ID per l'associazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top