Ruby on rails 如何为ActiveRecord模型设置model.changed?

Ruby on rails 如何为ActiveRecord模型设置model.changed?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,对于任何ActiveRecord模型,我都可以访问changed属性以获取已更改的字段数组 例如: a = Article.find(1) a.title = "New Title" a.changed => returns ["title"] 我有没有办法自己设置“已更改”属性?假设我想把它变成空的。原因是,我实际上是从缓存(Redis,但不管是哪个缓存)而不是从数据库读取文章属性 不幸的是,我做不到 def getArticleFromCache json = getJson

对于任何ActiveRecord模型,我都可以访问changed属性以获取已更改的字段数组

例如:

a = Article.find(1)
a.title = "New Title"
a.changed => returns ["title"]
我有没有办法自己设置“已更改”属性?假设我想把它变成空的。原因是,我实际上是从缓存(Redis,但不管是哪个缓存)而不是从数据库读取文章属性

不幸的是,我做不到

def getArticleFromCache
    json = getJsonFromCache()
    a = Article.new
    a.attributes = json
    a.changed = [] #doesn't work, changed contains ALL the attributes in the json
    return a
end
我能做什么


换句话说,我希望调用getArticleFromCache的人看起来好像是从数据库中获取的

我看你基本上是想清理改变了的历史

对于Rails 3,您可以使用
a.instance\u variable\u集(:@changed\u attributes,{})


对于Rails 4,您可以只使用
a.clear\u changes\u information

您可以通过

对于rails 4,它是:

a.send(:clear_changes_information)
对于rails 3,它是:

a.send(:reset_changes)
显然,私有的方法给出了一个很大的提示,它们不是被设计为直接调用的,但它会工作

通过将您的
文章
包装到另一个类中进行装饰,您可能会获得更大的成功或更整洁的解决方案。然后可以覆盖该装饰器类中的
更改
,以指示没有更改。您必须决定缓存中的一篇文章实际上需要多少内容才能表现得像一个模型类。例如,是否要保存它;您可能会遇到更多的问题,而不仅仅是试图隐藏更改