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