在一行中更改多个对象属性

时间:2012-03-17 15:56:49

标签: ruby-on-rails ruby-on-rails-3

我想知道,当你创建一个对象时,你经常可以在一行中设置多个属性,例如:

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

如果我想首先使用find_or_create_by,然后稍后更改其他属性怎么办?通常,我必须使用多行,例如:      @object = Model.find_or_create_by_attr1_and_attr2(“asdf”,13)      @ object.attr3 =“asdfasdf”      @ object.attr4 =“asdf”

是否有某种方法使用类似于Model.new方法接受键值对的哈希来设置属性?我对此感兴趣,因为我可以在一行上设置多个属性,如:

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

如果有人有任何想法,那就太棒了!

2 个答案:

答案 0 :(得分:48)

您想使用assign_attributesupdate_attributes

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

如果您选择update_attributes,则会立即保存该对象(当然,等待任何验证)

答案 1 :(得分:4)

您正在寻找的方法称为assign_attributesupdate_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.

在Rails应用程序中使用这些方法存在一些安全问题。如果您打算使用其中任何一个,尤其是在控制器中,请务必查看attr_accessible上的文档,以便恶意用户无法将任意信息传递到您希望不会成为可分配的模型字段