Ruby on rails 在哈希结构之外定义连接关系-CanCanCan
我希望使用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
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}
这对于我所寻找的已经足够了