Есть ли альтернатива update_attributes, которая не сохраняет запись?
Так что я мог сделать что-то вроде:
@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save
Кстати, я знаю, что могу @car.model = 'Sierra'
, но я хочу обновить их все в одной строке.
assign_attributes
apidock.com/rails/ActiveRecord/Base/assign_attributesОтветы:
Я верю в то, что вы ищете
assign_attributes
.Он в основном такой же, как update_attributes, но не сохраняет запись:
источник
attr_accessible :is_admin, :as => :admin
:;)attr_protected :is_admin
. Или:attr_accessible :name
Дело в том, что в этом примере: is_admin защищен. Следует также отметить, что попытка массового присвоения защищенного атрибута.assign_attributes
действительно вызываетActiveModel::MassAssignmentSecurity::Error
, хотя это не показано в примере.user.assign_attributes({ :name => 'Josh', :is_admin => true })
возникает сообщение об ошибке и фактически не устанавливается свойство имени пользователя.Вы можете использовать
assign_attributes
илиattributes=
(они одинаковы)Способы обновления шпаргалки (для Rails 6):
update
=assign_attributes
+save
attributes=
= псевдонимassign_attributes
update_attributes
= устарело, псевдонимupdate
Источник:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment .rb
Другая шпаргалка:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet
источник
Вы можете использовать метод «атрибутов»:
Источник: http://api.rubyonrails.org/classes/ActiveRecord/Base.html
attribute = (new_attributes, guard_protected_attributes = true) Позволяет установить все атрибуты одновременно, передав хеш с ключами, совпадающими с именами атрибутов (что снова совпадает с именами столбцов).
Если guard_protected_attributes имеет значение true (по умолчанию), то конфиденциальные атрибуты могут быть защищены от этой формы массового назначения с помощью макроса attr_protected. Или вы можете указать, какие атрибуты доступны с помощью макроса attr_accessible. Тогда все атрибуты, не включенные в это, не смогут быть назначены по массе.
источник
Для массового присвоения значений модели ActiveRecord без сохранения используйте методы
assign_attributes
либоattributes=
. Эти методы доступны в Rails 3 и новее. Тем не менее, есть небольшие различия и связанные с версией ошибки, о которых следует знать.Оба метода следуют этому использованию:
Обратите внимание, что ни один из методов не будет выполнять проверки или выполнять обратные вызовы; обратные вызовы и проверка будут происходить при
save
вызове.Рельсы 3
attributes=
немного отличается отassign_attributes
Rails 3.attributes=
проверит, что переданный ему аргумент является Hash, и немедленно возвращает, если это не так;assign_attributes
не имеет такой проверки хэша. См. Документацию API Назначения атрибутов ActiveRecord дляattributes=
.Следующий неверный код молча завершится ошибкой, просто вернувшись без установки атрибутов:
attributes=
будет молча вести себя так, как будто назначения были выполнены успешно, тогда как на самом деле они не были.Этот неверный код вызовет исключение, когда
assign_attributes
попытается преобразовать ключи хеша в массив:assign_attributes
вызоветNoMethodError
исключение дляstringify_keys
, указывая, что первый аргумент не является хешем. Само исключение не очень информативно о фактической причине, но тот факт, что исключение действительно имеет место, очень важен.Единственное различие между этими случаями заключается в методе, используемом для массового присваивания:
attributes=
молча завершается успешно иassign_attributes
выдает исключение, чтобы сообщить, что произошла ошибка.Эти примеры могут показаться надуманными, и они в некоторой степени, но этот тип ошибки может легко возникнуть при преобразовании данных из API или даже просто при использовании серии преобразований данных и забыв
Hash[]
о результатах финала.map
. Оставьте код на 50 строк выше и удалите 3 функции из вашего назначения атрибутов, и вы получите рецепт ошибки.Урок с Rails 3 таков: всегда используйте
assign_attributes
вместоattributes=
.Рельсы 4
В Rails 4
attributes=
это просто псевдонимassign_attributes
. См. Документацию API Назначения атрибутов ActiveRecord дляattributes=
.В Rails 4 любой метод может использоваться взаимозаменяемо. Неспособность передать Hash в качестве первого аргумента приведет к очень полезному исключению:
ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validations
Если вы выполняете предварительные проверки заданий при подготовке к a
save
, возможно, вас заинтересует проверка перед сохранением. Вы можете использоватьvalid?
иinvalid?
методы для этого. Оба возвращают логические значения.valid?
возвращает true, если несохраненная модель прошла все проверки, или false, если нет.invalid?
просто обратная сторонаvalid?
valid?
можно использовать так:Это даст вам возможность обрабатывать любые вопросы проверки до звонка
save
.источник