Pergunta

Eu tenho três modelos:

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

O problema é que, durante a execução, se eu adicionar um pacote a um release_item não está ciente de que o pacote é um pacote. Por exemplo:

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

Parece que eu deveria ter acesso a item.pack, mas não sabe que o pacote é um item Pack.

Foi útil?

Solução

Parece que o uso de has_one: através de está correto. O problema que você está vendo tem a ver com salvar objetos. Para uma associação ao trabalho, o objeto que está sendo referenciado precisa ter um ID para preencher o campo model_id para o objeto. Neste caso, PackReleaseItems ter um pack_id e um campo release_item_id que precisam ser preenchidos para a associação funcione corretamente. Tente guardar antes de acessar objetos através de uma associação.

Outras dicas

Seu problema está em como você está associando o ReleaseItem eo Pack.

has_many :through e has_one :through tanto trabalho através de um objeto que também atua como uma junção de tabela, neste caso PackReleaseItem. Uma vez que este não é apenas uma tabela de junção (se fosse, você deve apenas usar has_many sem :through), criando adequadamente a associação requer a criação do objeto juntar-se, assim:

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

O que você está fazendo com a sua chamada item.pack = pack é simplesmente associando os objetos na memória. Quando você vai procurá-lo novamente, ele parece "through" o pack_release_items, que está vazia.

Você deseja salvar ou criar (em vez de novo) o item e embalagem. id Caso contrário, o banco de dados não tem atribuído é para a associação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top