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

时间:2015-04-13 18:07:36

标签: ruby-on-rails ruby activerecord

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

例如:

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 ,就像从数据库中获取它一样。

2 个答案:

答案 0 :(得分:1)

我似乎基本上想要清理已更改的历史记录。

对于Rails 3,您可以使用a.instance_variable_set(:@changed_attributes, {})

对于Rails 4,您只需使用a.clear_changes_information

即可

答案 1 :(得分:1)

您可以通过ActiveModel::Dirty

中的私人方法完成此操作

对于rails 4,它是:

a.send(:clear_changes_information)

对于rails 3,它是:

a.send(:reset_changes)

显然,私有方法给出了一个很大的暗示,即它们不是为直接调用而设计的,但它会起作用。

通过将Article包装在另一个类中来装饰它,您可能会获得更多成功或更简洁的解决方案。然后,您可以覆盖该装饰器类中的changes以指示没有更改。您必须确定缓存中的文章实际上需要表达多少才能像模型类一样。例如,你想保存它吗?你可能会遇到更多问题,而不仅仅是试图隐藏变化。