如何使用update_attributes指定validation_context?
我可以使用2个操作(没有update_attributes)来做到这一点:
my_model.attributes = { :name => '123', :description => '345' }
my_model.save(:context => :some_context)
答案 0 :(得分:6)
没有办法做到这一点,这里是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