在 Rails 中使用动态字段分配模型字段值



>假设我有一个变量参数,它表示ActiveRecord模型中的字段名称。

我想将字段设置为特定值。

我知道有 2 种方法可以做到这一点(可能更多),但我的问题是这 2 种方法之间有什么区别(如果有的话)?

我应该记住什么陷阱,或者我可以互换使用这两种方式吗?

1) 方法1

a = Article.find(3)
a[param] = "value"
a.save

2) 方法 2

a = Article.find(3)
a.send("#{param}=", "value")
a.save

我会避免使用send("#{param}=", "value"),因为出于安全原因,这可以调用私有方法,而不是使用public_send。

由于这是轨道,我会使用update_attributeupdate_attributes。请注意update_attributes会触发验证回调,而update_attribute不会。

在您的示例中:

a = Article.find(3)
a.update_attribute(param, "value")
# or equivalent
a.assign_attribute(param, "value")
a.save

关于[]=,它是#write_attribute的别名(参见:https://api.rubyonrails.org/v3.0.8/classes/ActiveRecord/Base.html#method-i-5B-5D-3D)。有关属性分配的更多详细信息/差异,请参阅 https://davidverhasselt.com/set-attributes-in-activerecord/

最新更新