Ruby on rails 坎坎联想能力

Ruby on rails 坎坎联想能力,ruby-on-rails,many-to-many,associations,cancan,cancancan,Ruby On Rails,Many To Many,Associations,Cancan,Cancancan,我的问题是在下面的上下文中定义cancancan能力 我有一个在用户和公司实体之间具有多对多关系的通用模型 class User < ApplicationRecord has_many :company_users, dependent: :destroy has_many :companies, through: :company_users enum role:[:user, :admin, :superadmin] end class Company &

我的问题是在下面的上下文中定义cancancan能力

我有一个在用户和公司实体之间具有多对多关系的通用模型

class User < ApplicationRecord
    has_many :company_users, dependent: :destroy
    has_many :companies, through: :company_users 
    enum role:[:user, :admin, :superadmin]
end

class Company < ApplicationRecord
    has_many :company_users, dependent: :destroy
    has_many :users, through: :company_users
end

class CompanyUser < ApplicationRecord
    belongs_to :company
    belongs_to :user
end
工作正常

但是

当然,让我看看,只有当前用户,因为它在同一个users表上

我如何能够轻松管理属于同一家公司的用户之间的这种能力,以保持多对多关系


感谢您的帮助

您可以使用作用域解决此问题:

并定义:

can :manage, User, User.joins(companies: :users).where(companies: { users: { id: user.id } })

请看完整的要点:

在@coorasse推荐之后,我终于用以下两个作用域解决了我的问题 在user.rb中

scope :company_list, -> (user_id) {CompanyUser.where(:user_id => user_id).pluck(:company_id)}
scope :owned_users,  -> (user_id) {CompanyUser.where(:company_id => company_list(user_id)).pluck(:user_id).uniq}
在capability.rb中

can :manage, User, id: User.owned_users(user.id)

这很好。

这方面还有一个问题有待解决:。感谢@coorasse的支持和示例。但是,在我的应用程序上应用此选项时,我收到一条错误消息:“can?和cannot?调用不能与原始sql“can”定义一起使用。无法确定以下用户的检查代码:index User(id:integer,email:string,encrypted_password:string等)。我正在将cancan与railsadmin结合使用,这可能是错误的原因吗?我还尝试了scope:scope:owned_users,->(user_id){joins(companys::users)。其中(companys:{users:{id:user_id}})和can:manage,user,user.owned_users(user.id),但我也遇到了相同的错误。我还尝试了scope,如上所述“can:manage,User,id:User.owned_users(User.id).pulk(:id)”在ability.rb中,但我第一次尝试时只得到了一条记录:User.id…在您的帮助下,我最终通过使用范围功能解决了自己的问题。谢谢@coorasse原因是您还需要为单个元素定义它的块部分。
scope :company_list, -> (user_id) {CompanyUser.where(:user_id => user_id).pluck(:company_id)}
scope :owned_users,  -> (user_id) {CompanyUser.where(:company_id => company_list(user_id)).pluck(:user_id).uniq}
can :manage, User, id: User.owned_users(user.id)