Paper Trail Gem:如何为特定模型使用自定义item_type

时间:2016-05-12 01:14:48

标签: ruby paper-trail-gem

是否有为版本配置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'.

3 个答案:

答案 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文档中找到更多详细信息。