2009-06-29 5 views
1

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.

+0

Könnten Sie bitte die schema.rb-Definition anhängen? –

Antwort

2

Ich fand die Ursache für diesen Fehler innerhalb des nested_has_many_through Plugins. Es scheint, dass die Version, die ich installiert hatte, fehlerhaft war; Nach der Aktualisierung auf die neueste Version funktioniert mein Build erneut.

1

Warum Sie

self.journal.build(entry_params) 

statt

Entry.new(entry_params) 

rufen Sie Wenn Sie einen neuen Eintrag zu einem bestimmten Journal verbundenen erstellen, ein @journal gegeben, können Sie

@yournal.entries.build(entry_params) 
+1

Es ist tatsächlich @ journal.entries.build, ich vermasselt beim Eingeben der Frage, danke für das Hinzeigen. –