Изменить несколько атрибутов объекта в одной строке - PullRequest
29 голосов
/ 17 марта 2012

Мне было интересно, когда вы создаете объект, вы часто можете установить несколько атрибутов в одной строке, например:

 @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 ]

49 голосов
/ 17 марта 2012

Вы хотите использовать assign_attributes или update_attributes:

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

Если вы выберете update_attributes, объект будет сохраненнемедленно (в ожидании каких-либо проверок, конечно)

4 голосов
/ 17 марта 2012

Методы, которые вы ищете, называются assign_attributes или 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.

Существуют некоторые проблемы безопасности при использовании этих методов в приложениях Rails.Если вы собираетесь использовать любой из них, особенно в контроллере, обязательно ознакомьтесь с документацией по attr_accessible , чтобы злоумышленники не могли передавать произвольную информацию в поля модели, которые вы бы предпочли, чтобы не сталомасса присваивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...