Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Оба из них обновят объект без необходимости явно указывать AR для обновления.
Rails API говорит:
для update_attribute
Обновляет отдельный атрибут и сохраняет запись, не проходя обычную процедуру проверки. Это особенно полезно для логических флагов на существующих записях. Обычный метод update_attribute в Base заменяется этим при смешивании модуля валидации, который используется по умолчанию.
для update_attributes
Обновляет все атрибуты из переданного хэша и сохраняет запись. Если объект недействителен, сохранение не удастся и будет возвращено false.
Поэтому, если я не хочу проверять объект, я должен использовать update_attribute. Что если у меня будет это обновление для before_save, будет ли это переполнение стека?
Мой вопрос, делает ли update_attribute обход перед сохранением или только проверку.
Кроме того, каков правильный синтаксис для передачи хэша в update_attributes ... посмотрите мой пример вверху.
источник
update_attribute
заявление вbefore_save
обратный вызов? Я не могу придумать вескую причину для этого.before_save
обратном вызове). ИП вместоupdate_attribute(:discount, 0.1) if amount > 100
тебя мог сделатьdiscount = 0.1 if amount > 100
.update_attribute
вызываетsave
объект, который в этом случае не нужен, поскольку оператор находится внутри функцииbefore_save
обратного вызова и все равно будет сохранен. Я надеюсь, что в этом есть смысл.Ответы:
Пожалуйста, обратитесь к
update_attribute
. При нажатии на кнопку Показать исходный код вы получите следующий кода теперь обратитесь
update_attributes
и посмотрите на его код, который вы получитеразница между двумя
update_attribute
использует,save(false)
тогда какupdate_attributes
используетsave
или вы можете сказатьsave(true)
.Извините за длинное описание, но важно то, что я хочу сказать.
save(perform_validation = true)
Если значениеperform_validation
false, оно обходит (пропускает правильное слово) все проверки, связанные сsave
.Для второго вопроса
Ваш пример верен.
или
или если вы получите все поля данных и имени в хеш-коде,
params[:user]
используйте здесь простоисточник
Rails 3
. В комментариях в источнике очень ясно сказано, что «обратные вызовы вызываются».update_attributes
теперь это псевдоним дляupdate
Совет:
update_attribute
в Rails 4 не рекомендуется использовать Commit a7f4b0a1 . Удаляетupdate_attribute
в пользуupdate_column
.источник
update_attribute
пропускает проверку, но учитывает обратные вызовы,update_column
пропускает как проверки, так и обратные вызовы и не будет обновлять:updated_at
,update
это нормальная функция, которая будетupdate_column
не считается устаревшим, ноupdate_columns(name: value)
является предпочтительным.reset_column
был удален.update_attribute
Этот метод обновляет отдельный атрибут объекта, не вызывая проверку на основе модели.
update_attributes
Этот метод обновляет несколько атрибутов одного объекта, а также проходит проверку на основе модели.
Надеюсь, этот ответ прояснит, когда использовать какой метод активной записи.
источник
Также стоит отметить, что при
update_attribute
обновлении требуемый атрибут не обязательно должен быть занесен в белый список,attr_accessible
в отличие от метода массового назначения,update_attributes
который будет обновлять толькоattr_accessible
указанные атрибуты.источник
update_attribute
просто обновляет только один атрибут модели, но мы можем передать несколько атрибутов вupdate_attributes
метод.Пример:
Это проходит проверку
он не обновляется, если проверка не удалась.
источник
Отличные ответы. обратите внимание, что для ruby 1.9 и выше вы можете (и я думаю, что следует) использовать новый синтаксис хеша для update_attributes:
источник
Возможно, вас заинтересует посещение этого блога, посвященного всем возможным способам назначения атрибута или обновления записи (обновлено до Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Например, он отличается такими аспектами, как выполнение проверок, касание объекта updated_at или запуск обратных вызовов.В качестве ответа на вопрос ОП
update_attribute
не проходят обратные вызовы.источник
update_attribute
иupdate_attributes
похожи, но с одной большой разницей:update_attribute
не запускает проверки.Также:
update_attribute
используется для обновления записи с одним атрибутом.update_attributes
используется для обновления записи с несколькими атрибутами.Эти два метода действительно легко спутать, учитывая их сходные имена и работы. Поэтому
update_attribute
удаляется в пользуupdate_column
.Теперь в Rails4 вы можете использовать
Model.update_column(:column_name, column_value)
на местеModel.update_attribute(:column_name, column_value)
Нажмите здесь, чтобы получить больше информации о
update_column
.источник
Чтобы ответить на ваш вопрос,
update_attribute
пропускайте предварительно сохраненные «проверки», но он по- прежнему запускает любые другие обратные вызовы, например,after_save
и т. Д. Поэтому, если вы действительно хотите «просто обновить столбец и пропустить любое AR-Cruft», то вам нужно использовать (очевидно)Model.update_all(...)
см. https://stackoverflow.com/a/7243777/32453источник
Недавно я столкнулся
update_attribute
сupdate_attributes
проблемой « против» и «проверки», такими похожими именами, таким разным поведением, таким запутанным.Чтобы передать хеш
update_attribute
и обойти проверку, вы можете сделать:источник
Я думаю, что ваш вопрос, если наличие атрибута update_attribute в before_save приведет к бесконечному циклу (вызовов update_attribute в обратных вызовах before_save, первоначально инициированных вызовом update_attribute)
Я почти уверен, что он обходит обратный вызов before_save, так как фактически не сохраняет запись. Вы также можете сохранить запись, не вызывая проверки с помощью
Model.save false
источник