سؤال

لدي Entry نموذج ، Category نموذج إدخال يمكن أن يكون العديد من الفئات (من خلال EntryCategories):

class Entry < ActiveRecord::Base
  belongs_to :journal

  has_many :entry_categories
  has_many :categories, :through => :entry_categories
end

class Category < ActiveRecord::Base
  has_many :entry_categories, :dependent => :destroy
  has_many :entries, :through => :entry_categories
end

class EntryCategory < ActiveRecord::Base
  belongs_to :category
  belongs_to :entry
end

عند إنشاء إدخال جديد ، لقد خلق ذلك عن طريق الاتصال @journal.entries.build(entry_params), حيث entry_params هو المعلمات من دخول النموذج.إذا كان أي من الفئات المحددة ، ومع ذلك ، لم تحصل على هذا الخطأ:

ActiveRecord::HasManyThroughCantDissociateNewRecords in Admin/entriesController#create

Cannot dissociate new records through 'Entry#entry_categories' on '#'. Both records must have an id in order to delete the has_many :through record associating them.

علما أن '#' على الخط الثاني هو حرفي;لا إخراج كائن.

لقد حاولت تسمية بلدي فئات selectbox على شكل categories و category_ids ولكن لا تجعل الاختلاف ؛ إذا إما في entry_params, حفظ سوف تفشل.إذا يتم تحديد أي فئات أو إزالة categories من entry_params (@entry_attrs.delete(:category_ids)) حفظ يعمل بشكل صحيح ، ولكن فئات لا حفظ الواضح.

يبدو لي أن المشكلة هي أن EntryCategory سجل يحاول أن يكون قبل دخول سجل هو الخلاص ؟ لا ينبغي أن يكون بناء رعاية هذا ؟

تحديث:

وهنا الأجزاء ذات الصلة من المخطط.rb كما طلبت:

ActiveRecord::Schema.define(:version => 20090516204736) do

  create_table "categories", :force => true do |t|
    t.integer "journal_id",                                 :null => false
    t.string  "name",       :limit => 200,                  :null => false
    t.integer "parent_id"
    t.integer "lft"
    t.integer "rgt"
  end

  add_index "categories", ["journal_id", "parent_id", "name"], :name => "index_categories_on_journal_id_and_parent_id_and_name", :unique => true

  create_table "entries", :force => true do |t|
    t.integer  "journal_id",                                         :null => false
    t.string   "title",                                              :null => false
    t.string   "permaname",   :limit => 60,                          :null => false
    t.text     "raw_body",    :limit => 2147483647
    t.datetime "created_at",                                         :null => false
    t.datetime "posted_at"
    t.datetime "updated_at",                                         :null => false
  end

  create_table "entry_categories", :force => true do |t|
    t.integer "entry_id",    :null => false
    t.integer "category_id", :null => false
  end

  add_index "entry_categories", ["entry_id", "category_id"], :name => "index_entry_categories_on_entry_id_and_category_id", :unique => true

end

كما يوفر الدخول مع فئات يعمل بشكل جيد في تحديث العمل (عن طريق استدعاء @entry.attributes = entry_params) ، لذلك يبدو لي أن المشكلة فقط على أساس دخول غير الموجودة في النقطة التي EntryCategory السجلات محاولة إنشاء.

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

المحلول

لقد تتبعت سبب هذا الخطأ إلى داخل nested_has_many_through البرنامج المساعد.يبدو أن النسخة التي كنت قد ركبت كانت عربات التي تجرها الدواب;بعد التحديث إلى أحدث إصدار ، بناء يعمل مرة أخرى.

نصائح أخرى

لماذا تسمون

self.journal.build(entry_params)

بدلا من

Entry.new(entry_params)

إذا كنت بحاجة إلى إنشاء إدخال جديد المرتبطة معين مجلة نظرا @مجلة, يمكنك أن تفعل

@yournal.entries.build(entry_params)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top