2011-08-11 6 views
12

Ho un utente che può avere 0 o 1 profili. Nel mio Controller, voglio salvare il profilo se alcuni dei valori sono indicati, come segue:Qual è la differenza tra il metodo build e create nelle relazioni ActiveRecord?

# PUT /users/1 
def update 
    @user = User.find(params[:id]) 

    if @user.update_attributes(params[:user]) 
    if params[:profile][:available] == 1 #available is a checkbox that stores a simple flag in the database. 
     @user.create_profile(params[:profile]) 
    end 
    else 
    #some warnings and errors 
    end 
end 

La parte che mi chiedo è di circa create_profile, la magia create_somerelationname. Come si confronta alla magia build_somerelationname? E quando dovrei usare quale?

risposta

17

La differenza tra build e create è che salva anche l'oggetto creato come build restituisce solo l'oggetto appena creato (senza che sia ancora salvato).

La documentazione è in qualche modo nascosta here.

Quindi, a seconda se si è soddisfatti o meno dell'oggetto restituito, è necessario create (poiché non lo si cambierà più) rispettivamente build come si desidera aggiornarlo prima di salvare nuovamente (che consente di salvare un'operazione di salvataggio)

+0

collegamento non punta al posto giusto ... – mahatmanich

+0

@mahatmanich Grazie per aver menzionato, ho aggiornato il collegamento. – Veger

6

Dal guide

build_association (attributi = {})

il metodo build_association restituisce un nuovo oggetto o f il tipo associato. Questo oggetto verrà istanziato dagli attributi passati e verrà impostato il collegamento tramite la chiave esterna, ma l'oggetto associato non verrà ancora salvato.

create_association (attributi = {})

Procedimento create_association restituisce un nuovo oggetto della tipo associato. Questo oggetto verrà istanziato dagli attributi passati e verrà impostato il collegamento tramite la chiave esterna. Inoltre, l'oggetto associato verrà salvato (supponendo che superi le convalide ).

Ciò che è necessario utilizzare dipende dal requisito. Generalmente il build_association viene utilizzato nel nuovo metodo.

Problemi correlati