4

ユーザーは、場所とカテゴリの特定の組み合わせの記事を管理する権限を持っています。

たとえば、Dave は、パリの HR 記事の管理を許可される場合があります。ポールは、ロンドンのビジネス記事を管理することを許可される場合があります。

モデルとその関連付けは次のとおりです。

  • ユーザーには多くの権限があります
  • 許可はユーザー、場所、およびカテゴリに属します
  • カテゴリには多くの記事と権限があります
  • 場所には多くの記事と権限があります
  • 記事は場所とカテゴリに属します

私は言うことができます:

has_permission_on :articles, :to => :manage do
  if_attribute :location => { :permissions => { :user_id => is {user.id} }, :category => { :permissions => { :user_id => is {user.id} } }
end

記事レコード (カテゴリ ID が 1893、ロケーション ID が 2939) で allowed_to?(:delete) を呼び出すと、次のクエリが実行されます。

SELECT `categories`.*  FROM `categories`  WHERE `categories`.`id` = 1893 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893)
SELECT `locations`.*   FROM `locations`   WHERE `locations`.`id` = 2939 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.location_id = 2939)

私が実行する必要があるのは、実際には次のとおりです。

SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893 AND `permissions`.location_id = 2939)

これを達成する方法はありますか?


アップデート

さて、記事モデルにインスタンス メソッドができました。

def permitted_user_ids
  Permission.select('user_id').where(:location_id => location_id, :category_id => category_id).map(&:user_id)
end

私のルールは次のとおりです。

has_permission_on :articles, :to => :manage do
  if_attribute :permitted_user_ids => contains { user.id }
end

ここで、カテゴリ ID が 1893 で場所 ID が 2939 の記事レコードで allowed_to?(:delete) (または読み取り/更新/作成/管理) を呼び出すと、次のクエリが実行されます。

SELECT user_id FROM `permissions` WHERE `permissions`.`category_id` = 1893 AND `permissions`.`location_id` = 2939

...まさに私が欲しいものです。

ただし、 with_permissions_to スコープの動作が非常に奇妙です。

Article.with_permissions_to(:read)

生成されるようになりました:

SELECT `articles`.* FROM `articles` WHERE (`articles`.`id` = 9473)

...ここで、9473 は現在のユーザーの ID です!

私は非常に混乱しています。

4

2 に答える 2

0

サブクラスを使用し、cancanを使用して権限を管理できます。トップクラスのArticleを作成すると、すべての種類の記事をサブクラスにすることができます。サブクラスでは、cancanを使用して権限を管理できます。

于 2013-02-03T12:17:40.987 に答える
0

これはコメントであるはずですが、私はまだ45歳です:(

あなたは、、にpermission属していると言います。したがって、権限テーブルにはuser_id、location_id、およびcategory_id列があります。userlocationcategory

それが本当なら、なぜあなたはそのカテゴリーのbelongs_to許可と場所のbelongs_to許可を宣言するのですか?確かに関係はあるべきhas_manyですか?

has_many外部キー(カテゴリと場所)を持たないモデル、および外部キーbelongs_to(許可)を持っているモデルで使用する必要があります。

これがすべてあなたが作ったタイプミスであり、あなたが本当に意味したのは許可belongs_touserとhas_manyの場所とカテゴリであったなら許してください。

于 2013-02-03T12:19:20.493 に答える