ruby-on-rails 查找papertrail中特定属性已更改的版本

jgwigjjp  于 2023-08-08  发布在  Ruby
关注(0)|答案(5)|浏览(114)

我在我的项目中使用Papertrail gem,并进行了广泛的搜索,试图找到如何完成以下操作。
我想做的是找到我的对象的版本,其中一个特定的属性变成了一个特定的值,即
第一个月
有谁知道这是可能的,甚至与Papertrail?

beq87vna

beq87vna1#

以下是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
获取Version的id可以基于所提供的代码片段。

xt0899hw

xt0899hw2#

好吧,我已经得出结论,在paper_trail中这是不可能的开箱即用的。
我最终要做的是,当其中一个特定属性被更新时,在Versions表的单独元数据列中保存一个标志。
然后,我可以在将来搜索这些列,以找出特定属性何时更改。
希望这能帮到别人。

cgvd09ve

cgvd09ve3#

对于那些不想使用单独的元数据列的人,这里还有另一个选项:

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

字符串

cetgtptt

cetgtptt4#

从PaperTrail 12.1开始,您可以

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

字符串

332nm8kg

332nm8kg5#

如果您正在寻找将指定属性更改为任何值或从任何值更改的版本,您可以使用以下方法:

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

字符串

相关问题