我在我的项目中使用Papertrail gem,并进行了广泛的搜索,试图找到如何完成以下操作。我想做的是找到我的对象的版本,其中一个特定的属性变成了一个特定的值,即第一个月有谁知道这是可能的,甚至与Papertrail?
beq87vna1#
以下是attribute变为value的所有版本(在大多数应用程序中可能是1左右):
attribute
value
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可以基于所提供的代码片段。
updated_at[1]
xt0899hw2#
好吧,我已经得出结论,在paper_trail中这是不可能的开箱即用的。我最终要做的是,当其中一个特定属性被更新时,在Versions表的单独元数据列中保存一个标志。然后,我可以在将来搜索这些列,以找出特定属性何时更改。希望这能帮到别人。
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
字符串
cetgtptt4#
从PaperTrail 12.1开始,您可以
object.versions.where_object_changes_to(attribute: "value")
332nm8kg5#
如果您正在寻找将指定属性更改为任何值或从任何值更改的版本,您可以使用以下方法:
@object.versions .map(&:changeset) .select{|a| a["attribute"].present?}
5条答案
按热度按时间beq87vna1#
以下是
attribute
变为value
的所有版本(在大多数应用程序中可能是1左右):字符串
结果将类似于:
型
updated_at[1]
值指示attribute
何时变为value
。获取Version的id可以基于所提供的代码片段。
xt0899hw2#
好吧,我已经得出结论,在paper_trail中这是不可能的开箱即用的。
我最终要做的是,当其中一个特定属性被更新时,在Versions表的单独元数据列中保存一个标志。
然后,我可以在将来搜索这些列,以找出特定属性何时更改。
希望这能帮到别人。
cgvd09ve3#
对于那些不想使用单独的元数据列的人,这里还有另一个选项:
字符串
cetgtptt4#
从PaperTrail 12.1开始,您可以
字符串
332nm8kg5#
如果您正在寻找将指定属性更改为任何值或从任何值更改的版本,您可以使用以下方法:
字符串