【问题标题】:Defining a join relationship outside of Hash structure - CanCanCan在哈希结构之外定义连接关系 - CanCanCan
【发布时间】:2020-03-31 16:28:07
【问题描述】:

我希望使用 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】:

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

    这对我正在寻找的东西来说已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多