0

我有几个模型,我正在使用 Papertrail 跟踪版本更改。我想提取最近活动的时间线视图的版本,但用户应该只看到他们有权查看的模型的更改。

我使用 Cancan 来控制对应用程序所有区域的访问,Ability 类具有我需要的所有业务逻辑。但是,它在规则集中指定模型名称,例如 Post,而 PaperTrail 使用 Version 模型来存储更改。

我如何(有效地)将两个系统联系在一起,以便我可以要求数据库仅返回关联模型对用户可见的版本模型?我可以通过获取整个站点的整个时间线并在 Ruby 中循环它来做到这一点,但这是不可扩展的,我需要使用范围以便它在 SQL 中发生。

4

1 回答 1

0

Aversion也是一个 ActiveRecord 模型。这意味着您可以将其合并到您的能力课程中。object.versions.accessible_by(current_ability)在确保您的能力正确授权版本之后,您可以简单地执行此操作。

一个例子可能是:

can :read, Version do |version|
  ((version.item_type == 'Client') && (Client.find(version.item_id).account_manager_id == user.id)) ||
  ((version.item_type == 'Project') && (Project.find(version.item_id).allowed_users.map(&:id).include? user.id) )
end

当然,这可以通过使用来简化version.item,但是您必须将授权检查委托给另一个资源(这将使您能够简单地说can? :read, version.item)。这可能适合也可能不适合您的具体情况。上述方法提供了更大的灵活性。

于 2013-08-27T14:27:31.860 回答