سؤال

لدي ثلاثة نماذج:

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

يبدو أنني يجب أن يكون الوصول إلى هذا البند.حزمة لكنه يجهل أن حزمة هو حزمة البند.

هل كانت مفيدة؟

المحلول

ويبدو أن استخدام has_one :من خلال هو الصحيح.المشكلة أنك ترى له علاقة مع توفير الكائنات.لأي جمعية العمل الكائن الذي يتم الرجوع إليها يحتاج إلى معرف لملء 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 اتصل ببساطة ربط الكائنات في الذاكرة.عندما تذهب للبحث عنه مرة أخرى ، يبدو "throughpack_release_items, التي هي فارغة.

كنت تريد حفظ أو إنشاء (بدلا من الجديدة) البند حزمة.وإلا فإن قاعدة البيانات لم يتم تعيين معرف للجمعية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top