我有一个似乎无法定义的复杂规则,用户可以阅读他们自己的信件,或者如果他们有权限,他们可以阅读其他没有链接到任何类型的信件(如果他们是那么类型的话)控制谁看到它。)
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
我尝试的另一种方式是使用块/范围但是它会抱怨 “惨惨::错误: 无法将Active Record范围与其他条件合并。而是使用散列或SQL来读取Letter函数。“
can :read, Letter, Letter.without_type do |l|
l.letter_template_type.nil? || l.letter_template_type.types.empty?
end
有人可以帮我定义这种情况的规则吗?
答案 0 :(得分:0)
像这样使用,
can :read, Letter, [] do |l|
l.letter_template_type.nil? || l.letter_template_type.types.empty?
end
您还必须在上面的块中添加a user can read their own letters
条件,可能是l.user == your_ability_user
。