質問

3 つのモデルがあります。

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

問題は、実行中に release_item にパックを追加しても、そのパックがパックであることが認識されないことです。例えば:

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

item.pack にアクセスできるはずですが、そのパックが Pack アイテムであることに気づいていません。

役に立ちましたか?

解決

has_one :through の使用法は正しいようです。発生している問題は、オブジェクトの保存に関係しています。関連付けが機能するには、参照されるオブジェクトに、 model_id オブジェクトのフィールド。この場合、 PackReleaseItems 持っています pack_id そして release_item_id 関連付けが正しく機能するには、このフィールドに入力する必要があります。関連付けを通じてオブジェクトにアクセスする前に、保存してみてください。

他のヒント

あなたの問題は、それをどのように関連付けているかにあります ReleaseItem そしてその Pack.

has_many :through そして has_one :through この場合、どちらも結合テーブルとしても機能するオブジェクトを通じて機能します。 PackReleaseItem. 。これは単なる結合テーブルではないので (結合テーブルであれば、単に使用する必要があります) has_many それなし :through)、関連付けを適切に作成するには、次のように結合オブジェクトを作成する必要があります。

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

あなたが何をしているのか item.pack = pack call は単にメモリ内のオブジェクトを関連付けているだけです。改めて調べてみると「throughpack_release_items, 、空です。

アイテムとパックを (新規ではなく) 保存または作成したいと考えています。それ以外の場合、データベースは関連付けに ID を割り当てていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top