我在我的项目中使用Papertrail gem,并进行了广泛的搜索以尝试找到如何执行以下操作。
我想做的是找到我的对象的版本,其中特定属性成为特定值,即
object.versions.where(attribute: "value")
有谁知道 Papertrail 是否可以做到这一点?
我在我的项目中使用Papertrail gem,并进行了广泛的搜索以尝试找到如何执行以下操作。
我想做的是找到我的对象的版本,其中特定属性成为特定值,即
object.versions.where(attribute: "value")
有谁知道 Papertrail 是否可以做到这一点?
以下获取所有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 可以建立在提供的代码片段上。
好吧,我已经得出结论,这在 paper_trail 中是不可能开箱即用的。
我最终做的是,当某个特定属性被更新时,将一个标志保存在 Versions 表的单独元数据列中。
然后我可以在以后搜索这些列,以找出该特定属性何时发生变化。
希望这对其他人有帮助。
对于那些不想使用单独的元数据列的人来说,这是另一种选择:
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