Utilizando construir con has_many :through
-
21-08-2019 - |
Pregunta
Tengo una Entry
modelo y un Category
modelo, donde una Entrada puede tener muchas Categorías (a través de 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
Al crear una nueva Entrada, creo yo llamando @journal.entries.build(entry_params)
, donde entry_params
es que los parámetros del formulario de inscripción.Si cualquiera de las categorías seleccionadas, sin embargo, me sale este error:
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.
Tenga en cuenta que el '#' en la segunda línea es literal;no salida de un objeto.
He tratado de nomenclatura mi categorías selectbox en el formulario para categories
y category_ids
pero tampoco hacer una diferencia;si bien es en la entry_params
, para guardar fallará.Si no hay categorías seleccionadas, o puedo quitar categories
de entry_params
(@entry_attrs.delete(:category_ids)
), guardar funciona correctamente, pero las categorías no guardar, obviamente.
A mí me parece que el problema es que una EntryCategory registro es intentar ser realizados antes de la Entrada del registro se guarda?No debería ser construir teniendo cuidado de que?
Actualización:
He aquí las partes pertinentes de esquema.rb, como se pide:
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
También, el ahorro de una entrada con las categorías que funciona bien en la acción de actualización (llamando @entry.attributes = entry_params
), así que me parece que el problema se basa sólo en la Entrada no existente en el punto en el que la EntryCategory registros se pretende crear.
Solución
Localicé a la causa de este error para estar dentro del nested_has_many_through
plugin. Parece que la versión que había instalado era con errores; después de actualizar a la versión más reciente, mi construcción funciona de nuevo.
Otros consejos
¿Por qué llamas
self.journal.build(entry_params)
en lugar de
Entry.new(entry_params)
Si es necesario crear una nueva entrada asociado a una específica Diario, dado un @revista, puede hacerlo
@yournal.entries.build(entry_params)