对于 ActiveRecord 中的每个模型,似乎都有一个名为“changed”的私有属性,它是一个数组,列出了自从您从数据库中检索记录以来所有已更改的字段。
例子:
a = Article.find(1)
a.shares = 10
a.url = "TEST"
a.changed ["shares", "url"]
反正有没有自己设置这个“改变”的属性?我知道这听起来很 hacky/klunky,但我正在做一些相当不寻常的事情,即使用 Redis 来缓存/检索对象。
对于 ActiveRecord 中的每个模型,似乎都有一个名为“changed”的私有属性,它是一个数组,列出了自从您从数据库中检索记录以来所有已更改的字段。
例子:
a = Article.find(1)
a.shares = 10
a.url = "TEST"
a.changed ["shares", "url"]
反正有没有自己设置这个“改变”的属性?我知道这听起来很 hacky/klunky,但我正在做一些相当不寻常的事情,即使用 Redis 来缓存/检索对象。
ActiveModel::Dirty#changed
返回散列的键,@changed_attributes
散列本身返回属性名称及其原始值:
a = Article.find(1)
a.shares = 10
a.url = "TEST"
a.changed #=> ["shares", "url"]
a.changed_attributes #=> {"shares" => 9, "url" => "BEFORE_TEST"}
由于没有setter方法changed_attributes=
,所以可以强制设置实例变量:
a.instance_variable_set(:@changed_attributes, {"foo" => "bar"})
a.changed #=> ["foo"]
请参阅以下示例:Dirty Attributes
class Person
include ActiveModel::Dirty
define_attribute_methods :name
def name
@name
end
def name=(val)
name_will_change! unless val == @name
@name = val
end
def save
@previously_changed = changes
@changed_attributes.clear
end
end
所以,如果你有一个属性foo
并且想要“改变”那只是调用foo_will_change!
.