我被困住了。我一直试图找出如何将关联更改(has_many
,has_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,任何人都可以提供帮助吗?
我正在尝试对模型及其相关对象进行更改的审计跟踪,这些对象可以在一个变更集中访问。
答案 0 :(得分:2)
您需要的信息最终存储在相关表versions
和version_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添加新数据库表以跟踪相关模型。