2012-03-17 11 views
22

Mi chiedevo, quando si crea un oggetto spesso è possibile impostare più attributi in una sola riga per esempio:Modifica oggetto più attributi in una sola riga

@object = Model.new(:attr1=>"asdf", :attr2 => 13, :attr3 => "asdfasdfasfd") 

Cosa succede se voglio usare find_or_create_by prima, e poi cambiare altri attributi in seguito? In genere, avrei dovuto usare più righe, ad esempio: @object = Model.find_or_create_by_attr1_and_attr2 ("asdf", 13) @ object.attr3 = "asdfasdf" @ object.attr4 = "asdf"

c'è qualche modo di impostare gli attributi usando un hash simile a come il metodo Model.new accetta le coppie chiave-valore? Sono interessato a questo perché sarei stato in grado di impostare più attributi su una sola riga come:

@object = Model.find_or_create_by_attr1_and_attr2("asdf", 13) 
@object.some_method(:attr3 => "asdfasdf", :attr4 => "asdfasdf") 

Se qualcuno ha qualche idea, che sarebbe grande!

risposta

37

che si desidera utilizzare o assign_attributesupdate_attributes:

@object.assign_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasdf") 

Se si sceglie di update_attributes invece, l'oggetto viene salvato immediatamente (in attesa di eventuali convalide, ovviamente)

+0

Oh, hey, @jay, a proposito! : ^) – rjz

+0

hey questo non funziona, ottengo un errore metodo non definito .. e, ehi? hai già risposto a una delle mie domande? – jay

+0

Sì. Qualcosa sul metodo di classe ': serialize' la scorsa notte. Quale versione dei binari stai usando? – rjz

3

I metodi che stai cercando per sono chiamati assign_attributes o update_attributes.

@object.assign_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasf") # @object now has attr3 and attr4 set. 
@object.update_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasf") # @object now has attr3 and attr4 set and committed to the database. 

Ci sono alcuni problemi di sicurezza con l'utilizzo di questi metodi nelle applicazioni Rails. Se intendi utilizzare uno dei due, specialmente in un controller, assicurati di consultare la documentazione su attr_accessible in modo che gli utenti malintenzionati non possano passare informazioni arbitrarie in campi del modello che preferiresti non diventassero assegnabili in serie.

+0

hey, questo non funziona .. Ricevo un errore del metodo non definito, sia nella console di rails che nel controller. Sembra legittimo anche se .. – jay

Problemi correlati