定义通过belongs_to和has_many关系的CanCan能力

时间:2012-12-12 23:45:23

标签: ruby-on-rails ruby-on-rails-3 cancan

我一直困扰着这个问题。我的团队成员模仿如下:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

class Membership < ActiveRecord::Base
  attr_accessible :is_owner
  belongs_to :user
  belongs_to :group
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
  has_many :locations
end

群组也有很多位置,如下所示:

class Location < ActiveRecord::Base
  belongs_to :group
end

我正在尝试创建一种能够允许用户仅查看属于其组的位置的功能(组所有权通过成员资格上的is_owner字段完成)。这是我一直在尝试的:

can :read, Location, :group => { :memberships => { :user_id => user.id, :is_owner => true } }

这给了我以下错误:

SQLite3::SQLException: no such column: group.memberships

有没有办法创造这种能力?我已经尝试了很多关于这种能力的变化,但都没有效果。我不能使用块,因为我希望它能够处理索引操作。作为一种解决方法,我循环遍历所有位置并使用select!来挑选我can :read的那些......显然这不太理想。

1 个答案:

答案 0 :(得分:0)

尝试直接使用AR:Relation。我没有提到cancan如何接受SQL连接。

can :read, Location, Location.includes(:group => {:memberships = {}}).where(:group => { :memberships => { :user_id => user.id, :is_owner => true } })

或者:

can :read, Location, Location.includes(:group => {:memberships = {}}).where(["memberships.user_id = ? AND memberships.is_owner is ?", user.id, true]) do |location|
  location.group.memberships.exists?(:user_id => user.id, :is_owner => true)
end