2

私はしばらくの間、この問題に悩まされてきました。私は次のようにモデル化されたグループメンバーシップを持っています:

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ます...明らかにこれは理想的ではありません。

4

1 に答える 1

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
于 2012-12-12T23:50:48.633 に答える