在我正在开发的应用程序中,我们使用 PaperTrail 不仅可以跟上原始用户所做的更改,还可以跟上对具有“贡献者”角色的用户所做的更改,该用户有权更改授权配置文件.
我无法放在一起的一件事情是不允许未经批准的 paper_trail 版本不显示为“实时”。我们将在仪表板区域中构建个人资料所有者将批准编辑的区域。只是需要一些指导。谢谢!
最佳答案
我会使用 两个不同的类 :一个用于保存实时的、已批准的用户,另一个用于保存贡献的、未经批准的用户。我们称它们为 User
和 PendingUser
。
您可以让 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 的方法,这将导致两种不同的方法:
Version
模型存储所有内容。这意味着 User
和 PendingUser
都将在此处序列化,因此无需更改任何 UserVersion
,这意味着您需要提供 PendingUserVersion
类和表(非常简单,只需继承 UserVersion
的所有内容, table_name
的 appart )。 到现在为止还挺好。如果您的贡献者被允许查看其他贡献者创建的待处理用户,那么您就大功告成了 - 您只需要为 批准机制 编写逻辑:基本上,您复制
PendingUser
的实时版本的属性到 User
的实时版本(当然 PendingUser#user_id
除外)。批准更改后,您可能希望删除 PendingUser
和 PendingUser
版本,或者选择所有这些版本并将它们的类更改为 User
( 将 未批准版本与批准版本合并)。如果您的贡献者是 而不允许 看到彼此 未决 贡献,那么您将拥有 用户与许多 PendingUsers 关系。它可能会变得更复杂一些,因为您需要考虑在批准用户后,其他贡献者创建的所有其他 PendingUsers 将如何引用过时的用户版本。
祝你好运!
编辑: 添加了对 PendingUser 的用户引用。