Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Оба из них обновят объект, не имея необходимость явно говорить AR обновлять.
Направляющие API говорят:
для update_attribute
Обновляет единственный атрибут и сохраняет запись, не проходя нормальную процедуру проверки. Это особенно полезно для булевых флагов на существующих записях. Обычный update_attribute метод в Основе заменяется этим, когда модуль проверок смешан в, который это по умолчанию.
для update_attributes
Обновления все атрибуты от переданного - в Хеше и сохраняют запись. Если объект будет недопустим, то сохранение перестанет работать, и false будет возвращен.
Таким образом, если я не хочу проверять объект, я должен использовать update_attribute. Что, если у меня есть это обновление на before_save, будет оно stackoverflow?
Мой вопрос, делает update_attribute, также обходят, прежде чем сохранят или просто проверка.
Кроме того, что правильный синтаксис состоит в том, чтобы передать хеш update_attributes... проверяют мой пример наверху.
См. update_attribute
. Щелкнув по ссылке «Показать исходный код», вы получите следующий код
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614: def update_attribute(name, value)
2615: send(name.to_s + '=', value)
2616: save(false)
2617: end
, а теперь обратитесь к update_attributes
и посмотрите на его код, вы получите
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621: def update_attributes(attributes)
2622: self.attributes = attributes
2623: save
2624: end
разница между двумя: update_attribute
использует save ( false)
, тогда как update_attributes
использует save
или вы можете сказать save (true)
.
Извините за длинное описание, но то, что я хочу сказать, важно. save (perform_validation = true)
, если perform_validation
ложно, он пропускает (правильным словом будет пропуск) все проверки , связанные с save
].
По второму вопросу
Также, каков правильный синтаксис для передачи хэша в update_attributes ... посмотрите мой пример вверху.
Ваш пример верен.
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
или
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
, или если вы получаете все данные и имя полей в хеш-коде, скажите params [: user]
здесь используйте только
Object.update_attributes(params[:user])
Я думаю, ваш вопрос в том, приведет ли наличие update_attribute в before_save к бесконечный цикл (вызовов update_attribute в обратных вызовах before_save, изначально инициированных вызовом update_attribute)
Я почти уверен, что он обходит обратный вызов before_save, поскольку на самом деле он не сохраняет запись. Вы также можете сохранить запись без запуска проверок, используя
Model.save false