Frage

Ich habe ein Entry Modell und ein Category Modell, in dem ein Eintrag viele Kategorien (durch EntryCategories) haben kann:

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

Wenn Sie einen neuen Eintrag erstellen, ich schaffe es durch @journal.entries.build(entry_params) Aufruf, wo entry_params die Parameter aus dem Eingabeformular ist. Wenn alle Kategorien ausgewählt werden, aber ich diesen Fehler:

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.

Beachten Sie, dass das ‚#‘ in der zweiten Zeile ist wörtlich; es nicht ausgeben ein Objekt aus.

Ich habe versucht, meine Benennung Kategorien auf dem Formular SelectBox categories und category_ids aber weder einen Unterschied machen; wenn entweder im entry_params ist, wird das Speichern fehlschlagen. Wenn keine Kategorien ausgewählt werden, oder entferne ich categories von entry_params (@entry_attrs.delete(:category_ids)), das Speichern funktioniert, aber die Kategorien nicht speichern, offensichtlich.

Es scheint mir, dass das Problem ist, dass eine EntryCategory Aufzeichnung gemacht werden versucht, bevor der Eintrag Datensatz gespeichert wird? Sollte bauen nicht kümmern, dass nehmen?

Update:

Hier ist die relevanten Teile schema.rb, wie gewünscht:

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

Auch mit Kategorien einen Eintrag Speichern funktioniert in der Update-Aktion in Ordnung (durch @entry.attributes = entry_params Aufruf), so dass es mir scheint, dass das Problem nur basiert auf dem Eintrag nicht an dem Punkt bestehende, dass die EntryCategory Aufzeichnungen versucht werden sollen erstellt.

War es hilfreich?

Lösung

ich die Ursache dieses Fehlers innerhalb der nested_has_many_through Plugin. Es scheint, dass die Version, die ich installiert hatte, war Buggy; nachdem sie auf die neueste Version zu aktualisieren, funktioniert meine Build wieder.

Andere Tipps

Warum nennst du

self.journal.build(entry_params)

statt

Entry.new(entry_params)

Wenn Sie einen neuen Eintrag zu einem bestimmten Journal verbundenen erstellen müssen, da ein @journal, können Sie

@yournal.entries.build(entry_params)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top