Rails/PaperTrail:批准编辑

4
在我所开发的应用程序中,我们使用PaperTrail来跟踪原始用户所做的更改以及对拥有“贡献者”角色的用户进行的更改,这些用户可以访问授权的配置文件并进行更改。
唯一无法理解的部分是如何不允许未经批准的PaperTrail版本显示为“实时”版本。我们将创建一个仪表板区域,供配置文件所有者批准编辑内容。需要一些指导,谢谢!
1个回答

3
我会使用两种不同的类别:一种用于保存已批准的用户,另一种用于保存未批准的用户。我们称之为UserPendingUser
您可以让PendingUserUser继承所有内容,并只覆盖table_name。或者更好的是,两者都可以有一个共同的类来继承,例如BaseUser(或一个共同的concern)。您还需要一个对原始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 模型存储所有内容。这意味着 User 和 PendingUser 都将被序列化在其中,因此无需更改任何内容。
2. 专用类和表:PaperTrail 将用户版本化为 UserVersion,这意味着您需要提供一个 PendingUserVersion 类和表(非常简单,只需从 UserVersion 继承所有内容,除了 table_name)。
到目前为止一切都好。如果你的贡献者被允许查看其他贡献者创建的待定用户,则基本上可以完成 - 你只需要编写逻辑来批准机制:实际上,你可以将 PendingUser 的生效版本的属性复制到 User 的生效版本中(当然除了 PendingUser#user_id)。在批准更改后,您可能需要删除 PendingUser 和 PendingUser 版本,或选择所有这些版本并将其类更改为 User(将未批准的版本与已批准的版本合并)。
如果您的贡献者不允许看到彼此的待处理贡献,则您将拥有一个 User has-many PendingUsers 关系。这可能会变得更加复杂,因为您需要考虑如何在批准用户后,其他贡献者创建的所有 PendingUser 将引用过时的用户版本。
祝你好运!
编辑:添加了 PendingUser 的用户参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接