Направляющие: update_attribute по сравнению с update_attributes

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... проверяют мой пример наверху.

250
задан thenengah 5 May 2010 в 17:49
поделиться

2 ответа

См. 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])
323
ответ дан 23 November 2019 в 02:56
поделиться

Я думаю, ваш вопрос в том, приведет ли наличие update_attribute в before_save к бесконечный цикл (вызовов update_attribute в обратных вызовах before_save, изначально инициированных вызовом update_attribute)

Я почти уверен, что он обходит обратный вызов before_save, поскольку на самом деле он не сохраняет запись. Вы также можете сохранить запись без запуска проверок, используя

Model.save false

1
ответ дан 23 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: