我有一个我似乎无法定义的复杂规则,用户可以阅读他们自己的信件,或者如果他们有权限,他们可以阅读与任何类型无关的其他人的信件(如果他们是看到的类型控制它)。
class Letter < ActiveRecord::Base
belongs_to :letter_template
has_one :letter_template_type, through: :letter_template
end
class LetterTemplateType < ActiveRecord::Base
has_and_belongs_to_many :types
end
我已经尝试过了,认为它会覆盖它,但查看生成的 sql 它会执行“或(非字母匹配规则)”而不是“和(非字母匹配规则)”。
can :read, Letter
cannot :read, Letter, letter_template_type: { types: { active: [true, false] } } # the active [true, false] is just to find any type
我尝试的另一种方法是使用块/范围,但随后它抱怨“CanCan::Error:无法将 Active Record 范围与其他条件合并。而是使用散列或 SQL 来读取字母能力。”
can :read, Letter, Letter.without_type do |l|
l.letter_template_type.nil? || l.letter_template_type.types.empty?
end
谁能帮我为这种情况定义一个规则?