我对rails非常陌生,并且使用paper_trail gem是全新的。
我想显示每个对我的资产模型的位置或标记号所做的更改的列表。我已经安装了paper_trail,它似乎正常工作。在我看来,我有这个:
<% @asset.versions.order('created_at DESC').each do |version| %>
On <%= version.created_at %> <%= version.whodunnit %> updated this asset.<br>
<ul>
<li>Asset relocated from "<%= version.last.locaton %>" to "<%= version.location %> "</li>
<li>User changed from "<%= version.last.tag_number %>" to "<%= version.tag_number %> "</li>
</ul>
<% end %>
这给了我关于何时进行更改以及由谁创建的正确信息,但我无法确定显示说明的行(例如):资产从“223”重新定位到“258”或“标签号”已从“1173”至“1175”。
理想情况下,我只会显示已更改内容的信息。因此,如果位置发生变化但标签号没有变化,我只会显示位置线。
我甚至不知道从哪里开始。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
来自PaperTrail文档:
PaperTrail有一个可选的表列,可在创建名为object_changes
的版本时使用。这将存储 ONLY 版本之间所做的更改。这将允许您只显示每个版本之间的更改。它的工作原理如下。
>> widget = Widget.create :name => 'Bob'
>> widget.versions.last.changeset # {'name' => [nil, 'Bob']}
>> widget.update_attributes :name => 'Robert'
>> widget.versions.last.changeset # {'name' => ['Bob', 'Robert']}
>> widget.destroy
>> widget.versions.last.changeset # {}
如果您最近将paper_trail添加到模型中,则可以运行迁移以添加此列。这将跟踪未来的变化。
class AddObjectChangesColumnToVersions < ActiveRecord::Migration
def self.up
add_column :versions, :object_changes, :text
end
def self.down
remove_column :versions, :object_changes
end
end
我最近需要进行更改,但是,我们拥有20多个模型的多年版本数据,并补充说迁移只会在将来有所帮助,而不会在过去给我所有数据更改。
我最后为PaperTrail创建了一个补丁,添加了diff_previous
,diff_next
,diff_live
等方法,这些方法可以让我区分不同的版本。它是基于这个paper_trail(https://github.com/jeremyw/paper_trail/blob/master/lib/paper_trail/has_paper_trail.rb#L151-L156)补丁的想法,但我实现它完全不同。如果你想了解更多细节,我会看看我是否可以开源补丁。