在papertrail中查找特定属性发生更改的版本

问题描述 投票:0回答:5

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

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

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

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

ruby-on-rails ruby-on-rails-3 paper-trail-gem
5个回答
11
投票

以下内容获取

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

获取版本的 id 可以基于提供的代码片段构建。


6
投票

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

我最终做的是,当更新其中一个特定属性时,将一个标志保存在版本表中单独的“元数据列”中。 然后我可以在将来搜索这些列,以找出该特定属性何时发生更改。

希望这对其他人有帮助。


5
投票

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



1
投票

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



0
投票

@object.versions .map(&:changeset) .select{|a| a["attribute"].present?}

© www.soinside.com 2019 - 2024. All rights reserved.