是否有为版本配置item_type的选项?我有一个类Post,默认的item_type为Post
;是否可以配置为Foo
?
更新示例:
class Post < ActiveRecord::Base
has_paper_trail
end
post = Post.create # this creates a new post along with a version.
version = post.versions.first
version.item_type = 'Post' # Item type here is the name of the base model 'Post'.
答案 0 :(得分:0)
是否有为版本配置item_type的选项?我有一个类Post,默认的item_type是Post;是否可以配置为Foo?
没有。当您致电has_paper_trail
时,它会添加名为item
的多态关联。因此, PaperTrail不会控制数据库列item_type
,ActiveRecord会这样做。
以下是has_many
关联的定义:
has_many(
versions_association_name, # Usually "versions"
-> { order(model.timestamp_sort_order) }, # Usually "created_at"
class_name: version_class_name, # Usually "PaperTrail::Version"
as: :item # Specifies a polymorphic interface
)
答案 1 :(得分:0)
偶然发现了这一点,现在意识到它有点旧,但我想我会分享我的解决方案,因为我有同样的要求。这只是一个部分解决方案,但它有效我
我扩展了PaperTrail Version类并覆盖了item_type getter
class AuditTrail < PaperTrail::Version
xss_foliate :except => [:object, :object_changes]
def item_type
if(self[:item_type] == "SomethingIWantToChange")
return "Different String"
end
return self[:item_type]
end
end
然后我将每个模型设置为使用此类:
has_paper_trail :class_name => 'AuditTrail'
然后我可以查询版本表,返回的对象将通过重写的getter运行,item_type将按照我的要求运行:
audit_records = AuditTrail.where(someproperty: "something")
因此,在写入数据库时,这实际上并没有改变它,但这是我能找到的最好的方式,以不同的方式呈现给我的前端
请注意,如果您在不使用扩展对象的查询的情况下获取版本,则不会更改item_type,即:
Someobject.find(1).versions.last
^这仍然会从DB
返回item_type答案 2 :(得分:-1)
您需要class_name
选项。这应该适用于您的示例:
class Post < ActiveRecord::Base
has_paper_trail :class_name => 'Foo'
end
这会将Post
课程标记为Foo
。
您可以在Paper Trail部分的Custom Version Classes文档中找到更多详细信息。