查找papertrail中特定属性已更改的版本

Bet*_*rds 10 ruby-on-rails ruby-on-rails-3 paper-trail-gem

我正在我的项目中使用Papertrail宝石,并进行了广泛的搜索,试图找到如何做到以下几点.

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

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

有没有人知道Papertrail是否可以实现这一点?

vem*_*emv 9

下面得到所有地方版本attribute成为value(在大多数应用程序大概是1):

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

结果将是这样的:

[{"attribute"=>[nil, "value"],
  "updated_at"=>[2015-01-02 12:20:36 UTC, 2015-01-02 12:20:56 UTC]}]
Run Code Online (Sandbox Code Playgroud)

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

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


Bet*_*rds 5

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

我最后要做的是,当特定属性之一被更新时,将标志保存在“版本”表的单独的元数据列中。

然后,我将来可以针对这些列进行搜索,以了解该特定属性何时更改。

希望这可以帮助其他人。


Rep*_*lês 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
Run Code Online (Sandbox Code Playgroud)


Max*_*sky 1

从 PaperTrail 12.1 开始,您可以执行以下操作

object.versions.where_object_changes_to(attribute: "value")
Run Code Online (Sandbox Code Playgroud)