是否有为某个版本配置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'.发布于 2016-06-06 14:20:03
是否有为某个版本配置item_type的选项?我有一个类Post,它的默认item_type是Post;有没有一个选项可以配置为Foo?
不是的。
下面是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
)发布于 2017-01-23 23:23:18
只是偶然发现了这一点,现在意识到它有点老了,但我想我应该分享我的解决方案,因为我有同样的需求。这只是一个部分的解决方案,但它对我很有效
我已经扩展了PaperTrail版本类并覆盖了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'然后,我可以查询versions表,返回的对象将通过覆盖的getter运行,item_type将如我所需:
audit_records = AuditTrail.where(someproperty: "something")因此,这实际上不会改变它在数据库中的编写,但这是我能找到的将它以不同方式呈现给我的前端的最好方法
请注意,如果您在不使用扩展对象查询的情况下获取版本,则不会更改item_type:
Someobject.find(1).versions.last^这仍会从数据库返回item_type
发布于 2016-05-13 04:27:37
您需要class_name选项。这应该适用于您的示例:
class Post < ActiveRecord::Base
has_paper_trail :class_name => 'Foo'
end这会将Post类版本化为Foo。
您可以在Custom Version Classes部分的Paper Trail文档中找到更多详细信息。
https://stackoverflow.com/questions/37175689
复制相似问题