在Hash结构外部定义连接关系-CanCanCan

问题描述 投票:0回答:1

我正在寻求使用CanCanCan进行权限权限的加入关系。

起初,给我这个:

can :read, Block, page: { is_published: true }

给出docs的信息,它说我可以将它们定义为哈希。但是,我必须对其进行重构,以检查pagepublished_at上是否存在另一个字段或nil

这是我的新方块:

can :read, Block, ["pages.published_at IS NOT NULL"] do |block|
  block.page.published_at.present?
end

基本上,这就是我想要的要点。但是,当执行SQL语句检查时,它将说pages不存在-这是预料之中的,因为我尚未执行连接。

我想知道您是否必须在Block上创建一个处理联接的作用域。或者可以将联接放置在can语句中。

ruby-on-rails ruby cancancan
1个回答
0
投票

我进一步阅读了有关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 }

这足以满足我的需求。

© www.soinside.com 2019 - 2024. All rights reserved.