在我正在开发的应用程序中,我们使用 PaperTrail 不仅可以跟上原始用户所做的更改,还可以跟上对具有“贡献者”角色的用户所做的更改,该用户有权更改授权配置文件.

我无法放在一起的一件事情是不允许未经批准的 paper_trail 版本不显示为“实时”。我们将在仪表板区域中构建个人资料所有者将批准编辑的区域。只是需要一些指导。谢谢!

最佳答案

我会使用 两个不同的类 :一个用于保存实时的、已批准的用户,另一个用于保存贡献的、未经批准的用户。我们称它们为 UserPendingUser

您可以让 PendingUser 继承 User 的所有内容并覆盖 table_name 。或者,事件更好,两者都可以有一个他们继承的公共(public)类 - 例如BaseUser(或常见问题)。您还需要对原始 User ( PendingUser#user_id ) 的引用,以便了解更改属于谁。因此,您需要为 pending_users 表编写迁移,如下所示:

class BaseUser
  # Everything that used to be within your User class
end

class User < BaseUser
  self.table_name = 'users'
  has_one :pending_user # Or has_many, see the last paragraph
end

class PendingUser <  BaseUser
  self.table_name = 'pending_users'
  belongs_to :user
end

现在有两种设置 PaperTrail 的方法,这将导致两种不同的方法:
  • 默认方式 - PaperTrail 使用 Version 模型存储所有内容。这意味着 UserPendingUser 都将在此处序列化,因此无需更改任何
  • 专业类和表 :PaperTrail 版本 用户为 UserVersion ,这意味着您需要提供 PendingUserVersion 类和表(非常简单,只需继承 UserVersion 的所有内容, table_name 的 appart )。

  • 到现在为止还挺好。如果您的贡献者被允许查看其他贡献者创建的待处理用户,那么您就大功告成了 - 您只需要为 批准机制 编写逻辑:基本上,您复制 PendingUser 的实时版本的属性到 User 的实时版本(当然 PendingUser#user_id 除外)。批准更改后,您可能希望删除 PendingUserPendingUser 版本,或者选择所有这些版本并将它们的类更改为 User( 未批准版本与批准版本合并)。

    如果您的贡献者是 而不允许 看到彼此 未决 贡献,那么您将拥有 用户与许多 PendingUsers 关系。它可能会变得更复杂一些,因为您需要考虑在批准用户后,其他贡献者创建的所有其他 PendingUsers 将如何引用过时的用户版本。

    祝你好运!

    编辑: 添加了对 PendingUser 的用户引用。

    10-08 00:19