Ich habe ein Entry
Modell und ein Category
Modell, in dem ein Eintrag viele Kategorien (durch EntryCategories
) haben:Verwendung mit has_many bauen: durch
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 , wobei entry_params
die Parameter aus dem Eingabeformular sind. Wenn alle Kategorien ausgewählt werden, jedoch bekomme 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 die ‚#‘ in der zweiten Zeile ist wörtlich; Es gibt kein Objekt aus.
Ich habe versucht, meine Kategorien selectbox auf dem Formular zu categories
und category_ids
zu benennen, aber beide machen keinen Unterschied; Wenn sich beide in entry_params
befinden, schlägt das Speichern fehl. Wenn keine Kategorien ausgewählt sind oder ich categories
von entry_params
(@entry_attrs.delete(:category_ids)
) entferne, funktioniert die Sicherung ordnungsgemäß, aber die Kategorien werden natürlich nicht gespeichert.
Es scheint mir, dass das Problem darin besteht, dass ein EntryCategory-Datensatz versucht wird, bevor der Entry-Datensatz gespeichert wird? Sollte das nicht gebaut werden?
Update:
Hier 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 (durch @entry.attributes = entry_params
Aufruf), Es scheint mir also, dass das Problem nur darauf beruht, dass der Eintrag an dem Punkt nicht existiert, an dem die EntryCategory-Datensätze erstellt werden sollen.
Könnten Sie bitte die schema.rb-Definition anhängen? –