【发布时间】:2014-06-11 11:13:50
【问题描述】:
我在我的项目中使用Papertrail gem 并进行了广泛的搜索以尝试找到如何执行以下操作。
我想做的是找到我的对象的版本,其中特定属性成为特定值,即
object.versions.where(attribute: "value")
有谁知道 Papertrail 是否可以做到这一点?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 paper-trail-gem
我在我的项目中使用Papertrail gem 并进行了广泛的搜索以尝试找到如何执行以下操作。
我想做的是找到我的对象的版本,其中特定属性成为特定值,即
object.versions.where(attribute: "value")
有谁知道 Papertrail 是否可以做到这一点?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 paper-trail-gem
以下获取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。
可以根据提供的代码 sn-p 获取版本的 id。
【讨论】:
好吧,我已经得出结论,这在 paper_trail 中是不可能开箱即用的。
我最终做的是,当更新特定属性之一时,将标志保存在 Versions 表中的单独 metadata column 中。
然后我可以在以后搜索这些列,以了解该特定属性何时发生变化。
希望这对其他人有所帮助。
【讨论】:
对于那些不想使用单独的元数据列的人来说,这是另一种选择:
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
【讨论】: