【问题标题】:How to set model.changed for an ActiveRecord model?如何为 ActiveRecord 模型设置 model.changed?
【发布时间】:2015-06-19 03:56:04
【问题描述】:

对于任何 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 的人看起来好像是从数据库中获取的一样。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    看来你基本上是想清除更改的历史记录。

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

    对于 Rails 4,您可以使用 a.clear_changes_information

    【讨论】:

      【解决方案2】:

      您可以通过 ActiveModel::Dirty 的私有方法来完成此操作

      对于 rails 4 它是:

      a.send(:clear_changes_information)
      

      对于rails 3,它是:

      a.send(:reset_changes)
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多