Unter Verwendung mit has_many bauen: durch
-
21-08-2019 - |
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.
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)