2009-06-29 63 views
1

我有一個Entry模型和Category模型,如果一個條目中有許多分類(通過EntryCategories):使用構建具有的has_many:通過

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 

當創建一個新的條目,我創建它通過調用@journal.entries.build(entry_params) ,其中entry_params是來自輸入表單的參數。如果選擇的類別,但是,我得到這個錯誤:

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. 

注意,在第二行以「#」是逐字;它不輸出對象。

我已經嘗試將表單上的我的類別選擇框命名爲categoriescategory_ids,但都沒有區別;如果其中任一個在entry_params中,保存將失敗。如果未選擇類別,或者我從entry_params@entry_attrs.delete(:category_ids))中刪除categories,則保存工作正常,但類別顯然不保存。

在我看來,問題是entry條目記錄試圖在保存條目記錄之前進行?不應該建立照顧?

更新:

這裏的schema.rb的相關部分,如要求:

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 

此外,節能與類別的條目更新操作正常工作(通過調用@entry.attributes = entry_params)所以在我看來,問題只是基於不存在EntryCategory記錄被嘗試創建的條目。

+0

請問您可以附上schema.rb的定義嗎? – 2009-06-30 07:12:13

回答

2

我追蹤到這個錯誤的原因是在nested_has_many_through插件。看來,我安裝的版本是越野車;在更新到最新版本後,我的構建再次運行。

1

你爲什麼叫

self.journal.build(entry_params) 

,而不是

Entry.new(entry_params) 

如果你需要創建對應特定的雜誌新的項目,給予@journal,你可以做

@yournal.entries.build(entry_params) 
+1

它實際上是@ journal.entries.build,我在輸入問題時搞砸了,謝謝指出。 – 2009-06-30 03:33:31