С ActiveRecord объектов вы можете использовать .assign_attributes
или методы обновления :
user.assign_attributes(name: "abc", email: "[email protected]", mobile: "12312312")
# attributes= is a shorter alias for assign_attributes
user.attributes = { name: "abc", email: "[email protected]", mobile: "12312312" }
# this will update the record in the database
user.update(name: "abc", email: "[email protected]", mobile: "12312312")
# or with a block
user.update(name: "abc", mobile: "12312312") do |u|
u.email = "#{u.name}@test.com"
end
.update
принимает блок, в то время как assign_attributes нет. Если вы просто назначаете хэш литеральных значений - например, те, которые передаются пользователем в параметрах, тогда нет необходимости использовать блок.
Если у вас есть простой старый объект рубина, который вы хотите, чтобы оживить с массовым назначением вы можете сделать:
class User
attr_accessor :name, :email, :mobile
def initialize(params = {}, &block)
self.mass_assign(params) if params
yield self if block_given?
end
def assign_attributes(params = {}, &block)
self.mass_assign(params) if params
yield self if block_given?
end
def attributes=(params)
assign_attributes(params)
end
private
def mass_assign(attrs)
attrs.each do |key, value|
self.public_send("#{key}=", value)
end
end
end
Это позволит вам сделать:
u = User.new(name: "abc", email: "[email protected]", mobile: "12312312")
u.attributes = { email: "[email protected]", name: "joe" }
u.assign_attributes(name: 'bob') do |u|
u.email = "#{u.name}@example.com"
end
# etc.
Возможный дубликат [DRY способ присвоить значения хэша объекту] (http://stackoverflow.com/questions/3669801/dry-way-to-assign-hash-values-to-an-object) –
Если 'user' является' ActiveRecord', тогда ['attributes ='] (http://apidock.com/rails/ActiveRecord/AttributeAssignment/assign_attributes) может быть вариантом. – spickermann
Почему вам нравится ваш второй пример лучше первого? – spickermann