如何根据关联真实限制CanCan中的记录?

时间:2012-04-13 13:39:04

标签: ruby-on-rails cancan

我正在尝试使用CanCan来满足以下要求:

  1. 如果将交易分配给1-many网络,则用户可以在他/她是任何已分配网络的成员时阅读该交易。

  2. 如果没有为任何网络分配交易,任何注册用户都可以查看该交易,无论其网络成员身份如何。

  3. 如果交易未分配给网络,但交易被标记为member_only = true,则用户可以阅读该交易,如果他/她是任何网络的成员。 < / p>

  4. 如果交易未分配给网络且标记为member_only = false,则任何注册用户都可以阅读该交易。

  5. 访客(即非用户)无法阅读任何优惠

  6. 我认为我有2-4个以下内容:

    if current_user.persisted?
      can :read, Deal, current_user.networks.empty? ? { member_only: false } : {}
    end
    

    但是,我不确定如何进一步限制分配给网络的交易。这可能与CanCan有关。如果是这样,建议如何?谢谢。

2 个答案:

答案 0 :(得分:1)

试试accessible_by。 这样,如果用户无权访问数据,您只需显示一个空列表。 换句话说,您可以使用cancan范围限制对数据的访问,而不是限制对页面的访问。

另见:related answer

答案 1 :(得分:0)

这是我想出的。可能不是最好的解决方案,所以反馈表示欢迎。

if current_user.persisted?
  can :read, Deal, { id: DealAccessPolicy.accessible_deal_ids_for(current_user) }
end

class DealAccessPolicy
  def self.accessible_deal_ids_for(user)
    Deal.pluck(:id) - (Network.all - user.networks).map{|r| r.deals.map(&:id)}.flatten.uniq
  end
end