我正在寻求使用CanCanCan进行权限权限的加入关系。
起初,给我这个:
can :read, Block, page: { is_published: true }
给出docs的信息,它说我可以将它们定义为哈希。但是,我必须对其进行重构,以检查page
,published_at
上是否存在另一个字段或nil
。
这是我的新方块:
can :read, Block, ["pages.published_at IS NOT NULL"] do |block|
block.page.published_at.present?
end
基本上,这就是我想要的要点。但是,当执行SQL语句检查时,它将说pages
不存在-这是预料之中的,因为我尚未执行连接。
我想知道您是否必须在Block
上创建一个处理联接的作用域。或者可以将联接放置在can
语句中。
我进一步阅读了有关Block Conditions with Scopes的文档。
所以我继续这个例子:
1 # Block.rb
2 scope :owned_by_published_page, -> { joins(:page).where.not(pages: { published_at: nil }) }
3
4 # ability.rb
5 can :read, Block, Block.owned_by_published_page do |block|
6 block.page.published_at.present?
7 end
这可以工作,但是在遇到更多问题后,CanCanCan文档中突出显示了这些问题:
您无法将其与匹配相同操作和模型的多个罐定义一起使用,因为无法将它们组合在一起。在这种情况下,将引发异常。
当然,我还要配置一些无法合并在一起的权限。在这种情况下,我只是继续执行cannot
语句来处理反函数。
cannot :read, Block, page: { published_at: nil }
这足以满足我的需求。