【问题标题】:Paper Trail Gem: How to use a custom item_type for specific modelPaper Trail Gem:如何为特定模型使用自定义 item_type
【发布时间】:2016-05-12 01:14:47
【问题描述】:

是否有一个选项可以为某个版本配置 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'.

【问题讨论】:

  • 我更新了标题和帖子。这是为了纸迹宝石。

标签: ruby paper-trail-gem


【解决方案1】:

是否有一个选项可以为某个版本配置 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
)

【讨论】:

    【解决方案2】:

    刚刚偶然发现这个,现在意识到它有点老了,但我想我会分享我的解决方案,因为我有同样的要求。这只是部分解决方案,但对我有用

    我扩展了 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
    

    ^ 这仍然从数据库返回 item_type

    【讨论】:

      【解决方案3】:

      您需要class_name 选项。这应该适用于您的示例:

      class Post < ActiveRecord::Base
        has_paper_trail :class_name => 'Foo'
      end
      

      这会将Post 类版本化为Foo

      您可以在Custom Version Classes 部分的Paper Trail 文档中找到更多详细信息。

      【讨论】:

      • @HaiNguyen 这回答了你的问题吗?如果是这样,请单击答案旁边的复选标记以接受它。复选标记将变为绿色。也欢迎大家点赞!
      • OP 的问题是关于数据库列versions.item_type。将:class_name 传递给has_paper_trail 应该对此数据库列没有影响。
      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多