ActiveRecord:如何设置模型的“已更改”属性?

时间:2013-09-23 00:44:27

标签: ruby-on-rails ruby activerecord

对于ActiveRecord中的每个模型,似乎有一个名为“changed”的私有属性,它是一个列出自从数据库中检索记录以来已更改的所有字段的数组。

示例:

a = Article.find(1)
a.shares = 10
a.url = "TEST"

a.changed ["shares", "url"]

有没有自己设置这个“已更改”的属性?我知道这听起来很笨拙,但是我正在做一些非常不寻常的事情,它使用Redis来缓存/检索对象。

2 个答案:

答案 0 :(得分:2)

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=,您可以通过force设置实例变量:

a.instance_variable_set(:@changed_attributes, {"foo" => "bar"})
a.changed #=> ["foo"]

答案 1 :(得分:1)

请参阅以下示例: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!