2012-03-17 13 views
22

Me preguntaba, cuando se crea un objeto generalmente se pueden configurar varios atributos en una sola línea, por ejemplo:cambio de objeto múltiple en una sola línea

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

¿Qué pasa si quiero usar find_or_create_by primero, y luego cambiar otros atributos más tarde? Normalmente, tendría que utilizar múltiples líneas, por ejemplo: @object = Model.find_or_create_by_attr1_and_attr2 ("asdf", 13) @ object.attr3 = "asdfasdf" @ object.attr4 = "asdf"

¿Hay alguna forma de establecer atributos utilizando un hash similar a cómo el método Model.new acepta pares clave-valor? Estoy interesado en esto porque me gustaría ser capaz de establecer múltiples atributos en una sola línea como:

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

Si alguien tiene alguna idea, que sería genial!

Respuesta

37

que desea utilizar assign_attributes o update_attributes:

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

Si decide update_attributes lugar, el objeto se guardará inmediatamente (en espera de cualquier validación, por supuesto)

+0

Oh, hey, @jay, por cierto! : ^) – rjz

+0

oye, esto no funciona, obtengo un error de método indefinido ... y ¿eh? ¿Has respondido una de mis preguntas antes? – jay

+0

Sí ... algo sobre el método de clase ': serialize' anoche. ¿Qué versión de rieles estás usando? – rjz

3

Los métodos que está buscando para se llaman 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. 

hay algunas preocupaciones de seguridad con el uso de estos métodos en aplicaciones Rails. Si vas a usar cualquiera de ellos, especialmente en un controlador, asegúrate de consultar la documentación en attr_accessible para que los usuarios malintencionados no puedan pasar información arbitraria a los campos del modelo que preferirías que no se asignaran en masa.

+0

hey, esto no funciona .. Me da un error de método indefinido, tanto en la consola de rieles y en el controlador. Aunque parece legítimo ... – jay

Cuestiones relacionadas