Изменение атрибутов нескольких объектов в одной строке
Мне было интересно, когда вы создаете объект, вы можете часто устанавливать несколько атрибутов в одной строке, например:
@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")
Если у кого есть какие-то идеи, это было бы здорово!
Ответы
Ответ 1
Вы хотите использовать assign_attributes
или update_attributes
:
@object.assign_attributes(:attr3 => "asdfasdf", :attr4 => "asdfasdf")
Если вы выберете update_attributes
вместо этого, объект будет сохранен сразу (в ожидании любых проверок, конечно)
Ответ 2
Методы, которые вы ищете, называются 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, чтобы злоумышленники могли 't передавать произвольную информацию в поля модели, которые вы предпочли бы, чтобы не стать назначаемой массой.