Pergunta

Eu tenho um modelo Entry e um modelo Category, onde uma entrada pode ter muitas categorias (através 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

Ao criar uma nova entrada, eu criá-lo chamando @journal.entries.build(entry_params), onde entry_params são os parâmetros do formulário de inscrição. Se nenhuma das categorias são selecionados, no entanto, eu recebo este erro:

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.

Note que o '#' na segunda linha é verbatim; que não produz um objeto.

Eu tentei nomear minhas categorias selectbox no formulário para categories e category_ids mas nem fazer a diferença; se qualquer um está no entry_params, a salvar irá falhar. Se nenhuma categoria são selecionados, ou eu remover categories de entry_params (@entry_attrs.delete(:category_ids)), o salvamento funciona corretamente, mas as categorias não salvar, obviamente.

Parece-me que o problema é que um registro EntryCategory está tentando ser feita antes que o registro de entrada é salvo? não deve construir estar cuidando disso?

Update:

Eis as partes relevantes do schema.rb, conforme solicitado:

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

Além disso, salvar uma entrada com categorias bem funciona na ação de atualização (chamando @entry.attributes = entry_params), por isso não me parece que o problema é baseado apenas na entrada não existente no ponto em que os registros EntryCategory são tentou ser criado.

Foi útil?

Solução

Eu rastreou a causa deste erro para estar dentro do nested_has_many_through plugin. Parece que a versão que eu tinha instalado foi de buggy; Depois de atualizar para a versão mais recente, minha compilação funciona novamente.

Outras dicas

Por que você chama

self.journal.build(entry_params)

em vez de

Entry.new(entry_params)

Se você precisa criar uma nova entrada associada a um específico Journal, dado um @journal, você pode fazer

@yournal.entries.build(entry_params)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top