对于任何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 ,就像从数据库中获取它一样。
答案 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
以指示没有更改。您必须确定缓存中的文章实际上需要表达多少才能像模型类一样。例如,你想保存它吗?你可能会遇到更多问题,而不仅仅是试图隐藏变化。