2016-03-20 8 views
0

Ich habe ein Modell user_item mit einem Attribut namens :primary_image_id. A user_itemhas_manyuser_item_images. Der Zweck der primary_image_id ist, es gleich der ID eines der user_item_images so zu setzen, dass ich Logik verwenden kann, damit das Objekt vom Benutzer in der Ansicht nicht gelöscht werden kann.Rails - Set-Attribut der Eltern basierend auf Kind-ID nach beiden zusammen erstellt

Eine user_item sollte niemals ohne dieses Attributset existieren oder zumindest für ein paar Sekunden existieren, bis das Attribut gesetzt ist. In meiner Form wird die user_item zusammen mit user_item_images erstellt.

Es scheint wie user_item_image.id wird nur nach dem Erstellen festgelegt. Ich versuchte dabei einen after_create Rückruf auf dem user_item

def set_primary_image_id 
    self.primary_image_id = self.user_item_images.first.id 
    end 

aber es scheint nicht zu funktionieren, ich nehme an, weil das Kind erstellt Wan't und so nicht eine ID haben.

Ich glaube, ich könnte auf das user_item_image Modell einen after_create Rückruf tun, so etwas wie:

def set_user_item_primary_image_id 
    user_item = self.user_item 
    user_item.primary_image_id = user_item.user_item_images.first.id 
end 

aber dies scheint übertrieben, weil es wirklich nicht jedes Mal, wenn ein user_item_image erstellt getan werden soll.

Antwort

1

Ihr after_create s kann das Feld richtig einstellen, aber sie schreiben nichts in die Datenbank. Versuchen:

update_attributes(primary_image_id: user_item_images.first.id) 

Wenn die user_item_images vorhanden sein, bevor Sie die user_item erstellen, können Sie auch das Feld in einem before_create einstellen könnten, wodurch die Notwendigkeit für eine zweite Schreibabfrage zu vermeiden. Was auch immer Sie tun, streuen Sie einige Ausdrucke oder lassen Sie sie in einen Debugger fallen, um zu prüfen, ob Sie keine Daten haben oder nicht schreiben.

Wenn Sie alles sind die Schaffung alles auf einmal build verwenden, werden alle Objekte erstellt und IDs vor UserItem#set_user_item_primary_image_id Läufe haben werden, so dass dies gut funktionieren:

ui = UserItem.new(params[:user_item]) 
image = ui.user_item_images.build(params[:user_item_image]) 
ui.save # Creates UserItem, creates UserItemImage, assigns primary_image_id 

Um dies noch sauberer zu machen Besuche accepts_nested_attributes_for.

+0

Ich habe eine verschachtelte Form, die ein 'user_item' sowie' user_item_images' erzeugt, die zum 'user_item' beim Senden gehören. Wenn ich das 'after_create' auf das 'user_item'-Modell lege, würde dies nach der gesamten Transaktion geschehen oder würde es passieren, bevor die' user_items'-Childs existieren? – user4584963

+0

Mit 'build' wird das' after_create' ausgeführt, sobald alle benötigten IDs vorhanden sind. –

Verwandte Themen