4

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

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

4

1 回答 1

3

我会使用两个不同的类:一个保存实时的、批准的用户,另一个保存贡献的、未批准的用户。让我们称它们为Userand 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的方法,这将导致两种不同的方法:

  1. 默认方式- PaperTrail 使用Version模型存储所有内容。这意味着两者都UserPendingUser在此处序列化,因此无需更改任何内容

  2. 专门的类和表:PaperTrail 版本的用户为UserVersion,这意味着您需要提供一个PendingUserVersion类和表(非常简单,只需从 继承所有内容UserVersion,appart 从table_name)。

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

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

祝你好运!

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

于 2014-01-20T21:16:37.233 回答