gpt4 book ai didi

ruby-on-rails - 验证上下文和更新属性

转载 作者:行者123 更新时间:2023-12-05 00:36:15 25 4
gpt4 key购买 nike

如何使用 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 的 block 中。以防止某些分配修改关联中的数据的问题。因此,当手动调用这些操作时,您会更安全。

一个简单的技巧是将上下文相关的公共(public)方法添加到您的模型中,如下所示:
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

关于ruby-on-rails - 验证上下文和更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com