Rails / Papertrail:变更集与关联更改

时间:2015-08-11 22:34:51

标签: ruby-on-rails associations has-many-through has-many paper-trail-gem

我被困住了。我一直试图找出如何将关联更改(has_manyhas_many through)包含在具有papertrail的模型中。我想调用MyModel.versions.first.changeset并对关联对象发生的任何更改都包含在从该版本的对象返回的.changeset哈希中。

我已添加版本关联的迁移:

class CreateVersionAssociations < ActiveRecord::Migration
  def self.up
    create_table :version_associations do |t|
      t.integer  :version_id
      t.string   :foreign_key_name, :null => false
      t.integer  :foreign_key_id
    end
    add_index :version_associations, [:version_id]
    add_index :version_associations, [:foreign_key_name, :foreign_key_id], :name => 'index_version_associations_on_foreign_key'
  end

  def self.down
    remove_index :version_associations, [:version_id]
    remove_index :version_associations, :name => 'index_version_associations_on_foreign_key'
    drop_table :version_associations
  end
end


class AddTransactionIdColumnToVersions < ActiveRecord::Migration
  def self.up
    add_column :versions, :transaction_id, :integer
    add_index :versions, [:transaction_id]
  end

  def self.down
    remove_index :versions, [:transaction_id]
    remove_column :versions, :transaction_id
  end
end

我已将Papertrail添加到关联对象中,但据我所知,没有文档讨论检索关联对象上发生的更改。如果可以使用Papertrail,任何人都可以提供帮助吗?

我正在尝试对模型及其相关对象进行更改的审计跟踪,这些对象可以在一个变更集中访问。

2 个答案:

答案 0 :(得分:2)

您需要的信息最终存储在相关表versionsversion_associations中。

但是,paper_trail不提供以您希望的方式访问信息的方法。但是你可以自己编写一个自定义方法来获取一个对象的关联版本列表。

我们假设你有以下型号:

class Article < ApplicationRecord
    has_many :comments
    has_paper_trail
end

class Comment < ApplicationRecord
    belongs_to :article
    has_paper_trail
end

您可以通过以下方式找到文章对象article的所有评论版本:

PaperTrail::Version.where(item_type: 'Comment')
                   .joins(:version_associations)
                   .where(version_associations: { foreign_key_name: 'article_id', foreign_key_id: article.id })
                   .order('versions.created_at desc')

您可以对gem进行修补,或者将此方法定义为Article类的实例方法,以便您可以轻松调用它,例如article.comment_versions

请注意,以上信息在article.versions.first.changeset中不可用,因为如果您更改评论但不更改文章,则文章版本化,只有评论是

但上述方法允许您访问关联更改的历史记录。

答案 1 :(得分:-1)

看起来这已被添加为papertrail gem的实验性功能

在这里查看文档 https://github.com/airblade/paper_trail/blob/v4.2.0/README.md#associations

此更改将需要为papertrail添加新数据库表以跟踪相关模型。