如何使用 update_attributes 指定 validation_context ?
我可以使用 2 个操作(没有 update_attributes)来做到这一点:
my_model.attributes = { :name => '123', :description => '345' }
my_model.save(:context => :some_context)
如何使用 update_attributes 指定 validation_context ?
我可以使用 2 个操作(没有 update_attributes)来做到这一点:
my_model.attributes = { :name => '123', :description => '345' }
my_model.save(:context => :some_context)
没有办法做到这一点,update_attributes
这是(这是 的别名update
)的代码
def update(attributes)
with_transaction_returning_status do
assign_attributes(attributes)
save
end
end
如您所见,它只是分配给定的属性并保存,而不向save
方法传递任何参数。
这些操作包含在传递给的块中,with_transaction_returning_status
以防止某些分配修改关联中的数据的问题。因此,当手动调用这些操作时,您会更安全。
一个简单的技巧是将上下文相关的公共方法添加到您的模型中,如下所示:
def strict_update(attributes)
with_transaction_returning_status do
assign_attributes(attributes)
save(context: :strict)
end
end
您可以通过将update_with_context
权限添加到您的ApplicationRecord
(Rails 5 中所有模型的基类)来改进它。因此,您的代码将如下所示:
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
# Update attributes with validation context.
# In Rails you can provide a context while you save, for example: `.save(:step1)`, but no way to
# provide a context while you update. This method just adds the way to update with validation
# context.
#
# @param [Hash] attributes to assign
# @param [Symbol] validation context
def update_with_context(attributes, context)
with_transaction_returning_status do
assign_attributes(attributes)
save(context: context)
end
end
end