【问题标题】:Find version where specific attribute has changed in papertrail在 papertrail 中查找特定属性已更改的版本
【发布时间】:2014-06-11 11:13:50
【问题描述】:

我在我的项目中使用Papertrail gem 并进行了广泛的搜索以尝试找到如何执行以下操作。

我想做的是找到我的对象的版本,其中特定属性成为特定值,即

object.versions.where(attribute: "value")

有谁知道 Papertrail 是否可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 paper-trail-gem


    【解决方案1】:

    以下获取attribute 变为value 的所有版本(在大多数应用中可能约为 1):

    object.versions.
           map(&:object_changes).
           map{|a| YAML::load a}.
           select{|a| (a[:attribute] || [])[1]=='value'}
    

    结果会是这样的:

    [{"attribute"=>[nil, "value"],
      "updated_at"=>[2015-01-02 12:20:36 UTC, 2015-01-02 12:20:56 UTC]}]
    

    updated_at[1] 值表示attribute 何时变为value

    可以根据提供的代码 sn-p 获取版本的 id。

    【讨论】:

    • 谢谢,这确实回答了我原来的问题。虽然为了处理速度(即数据库查询等),我最初的方法仍然是我最喜欢的方法。
    【解决方案2】:

    好吧,我已经得出结论,这在 paper_trail 中是不可能开箱即用的。

    我最终做的是,当更新特定属性之一时,将标志保存在 Versions 表中的单独 metadata column 中。

    然后我可以在以后搜索这些列,以了解该特定属性何时发生变化。

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案3】:

      对于那些不想使用单独的元数据列的人来说,这是另一种选择:

      def version_where_attribute_changed_to(attribute_name, attribute_value)
        versions.select do |version|
          object_changes = YAML.load version.object_changes
          (object_changes[attribute_name.to_s] || [])[1] == attribute_value
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 1970-01-01
        • 2018-02-22
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        相关资源
        最近更新 更多