13

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

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

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

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

4

3 回答 3

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 可以建立在提供的代码片段上。

于 2015-01-02T17:51:02.527 回答
6

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

我最终做的是,当某个特定属性被更新时,将一个标志保存在 Versions 表的单独元数据列中。

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

希望这对其他人有帮助。

于 2014-06-13T08:28:02.060 回答
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
于 2018-01-29T13:20:55.210 回答