我一直困扰着这个问题。我的团队成员模仿如下:
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
的那些......显然这不太理想。
答案 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