我的班级用户和页面之间存在以下关系。
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 }
答案 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_users
到class 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%'
}
)
]
}
});