0

我对 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”。

理想情况下,我只会显示已更改事物的信息。因此,如果位置更改但标签号没有更改,我将仅显示位置行。

我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢!

4

1 回答 1

1

来自 PaperTrail 文档:PaperTrail 有一个可选的表格列,可以在创建名为object_changes. 这将存储版本之间所做的更改。这将允许您仅显示每个版本之间的更改。它是这样工作的。

>> 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这将使我能够区分版本。它基于这个 paper_trail 补丁的想法(https://github.com/jeremyw/paper_trail/blob/master/lib/paper_trail/has_paper_trail.rb#L151-L156),但我实现它的方式完全不同。如果您想了解更多详细信息,我会看看我是否可以开源该补丁。diff_nextdiff_live

于 2013-09-26T13:16:53.723 回答