Ruby on rails 在哈希结构之外定义连接关系-CanCanCan

Ruby on rails 在哈希结构之外定义连接关系-CanCanCan,ruby-on-rails,ruby,cancancan,Ruby On Rails,Ruby,Cancancan,我希望使用CanCanCan为能力权限执行连接关系 最初,我得到了这样的建议: can :read, Block, page: { is_published: true } 根据来自的信息,它说我可以将它们定义为散列。但是,我必须重构它,以检查页面,上发布的上的另一个字段是否存在或为零 这是我的新街区: can :read, Block, ["pages.published_at IS NOT NULL"] do |block| block.page.published_at.presen

我希望使用CanCanCan为能力权限执行连接关系

最初,我得到了这样的建议:

can :read, Block, page: { is_published: true }
根据来自的信息,它说我可以将它们定义为散列。但是,我必须重构它,以检查
页面
上发布的
上的另一个字段是否存在或
为零

这是我的新街区:

can :read, Block, ["pages.published_at IS NOT NULL"] do |block|
  block.page.published_at.present?
end
基本上这就是我想要的要点。但是,当执行SQL语句检查时,它会说
页面
不存在-这是预期的,因为我没有执行联接


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

我进一步阅读了其中提到的文档

所以我继续这个例子:

 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
这是可行的,但在我遇到坎坎坎文档中强调的另外两个问题后:

您不能将其用于匹配同一动作和模型的多个can定义,因为无法将它们组合在一起。在这种情况下,将引发异常

当然,我还配置了一些无法合并的权限。在本例中,我只是继续执行
cannot
语句来处理相反的结果

无法:读取、阻止、页面:{published_at:nil}

这对于我所寻找的已经足够了