具有has_and_belongs_to_many的cancancan能力

时间:2017-01-18 21:21:19

标签: ruby-on-rails cancan cancancan

我的班级用户和页面之间存在以下关系。

class User < ApplicationRecord
  has_and_belongs_to_many :pages
end

class Page < ApplicationRecord
  has_and_belongs_to_many :users
end

如何在我的Ability文件中为用户编辑属于他的页面?

class Ability
  include CanCan::Ability
  def initialize(user)
      if user.is? :page_administrator
        can :manage, Page
      end
  end
end

我尝试以下方法,但我仍然不能。

  can :manage, Page, users: { user_id: user.id }

1 个答案:

答案 0 :(得分:3)

class User < ApplicationRecord has_many :user_pages has_many :pages, through: :user_pages end class Page < ApplicationRecord has_many :user_pages has_many :users, through: :user_pages end class UserPage < ApplicationRecord belongs_to :user belongs_to :page end 最大的问题是它无法将数据附加到连接表。而是使用连接模型:

has_and_belongs_to_many

这与UserPage类似,但不是无头 - 您可以直接查询users_pages。除了创建UserPage模型之外,您唯一需要做的就是将表从user_pages重命名为pages_users(或page_usersclass RenameUsersPages < ActiveRecord::Migration[5.0] def change rename_table('users_pages', 'user_pages') end end )。

Users::Page

这是必需的,因为rails会将表格链接到常量admin

现在,您可以轻松地在UserPage表格上附加class AddPageAdministratorToUserPages < ActiveRecord::Migration[5.0] change_table :users do |t| t.boolean :admin, default: false end end 标记。

user_pages

现在我们可以通过检查class Ability include CanCan::Ability def initialize(user) can :manage, Page do |p| p.user_pages.exists?(admin: true, user: user) end end end 中是否存在记录来检查用户是否是管理员:

Table.findAll({
  attributes: ['createdAt', 'col'],
  where: {
    $and:[
      {
        createdAt:{
          $between:[minDate, maxDate]
        }
      },
      Sequelize.where(
        Sequelize.fn('lower', Sequelize.col('col')),
        {
          $like: 'abcd%'
        }
      )
    ]
  }
});