1

ユーザーと呼ばれるモデルがあり、その一部は作成者と見なされます。これは、Rolesと呼ばれるテーブルを介して実行されます。このテーブルには、さまざまなロールがリストされています。「作成者」は1つです。アクセス許可と呼ばれるテーブル内の多対多の関連付けは、ロールとユーザーをリンクします。

ユーザーが作成者のアクセス許可を持っているかどうかを確認するために、その特定のユーザーにリンクされているアクセス許可を実行し、それらのいずれかが作成者のアクセス許可にもリンクしているかどうかを返すメソッドがあります。

このシステムは私によく役立っています。ただし、サイトで著者を検索して注文するのは不格好です。私がやりたいのは、シンプルで優雅なことです。理想的には、Users.authors.order( "date_joined")などのことを言うことができる名前付きスコープのようなものです。

現在のところ、「作成者」ユーザーのグループを取得するには、すべてのユーザーをデータベースから取り出し、一度に1人ずつ実行し、作成者のアクセス許可を検索してから追加する以外に方法はありません。見つかった場合は、ユーザーの配列に。

これは、特に著者のリストをビューに表示するたびに実行する必要があるため、かなり不愉快に思えます。

もっと良い方法はありますか?

編集-解決策:

以下の役立つアドバイスとhttp://railscasts.com/episodes/215-advanced-queries-in-rails-3?view=asciicastからのヒントに従って、次のことをまとめることができました。

User.rbの場合:

    class User < ActiveRecord::Base
      scope :authors, joins(:permissions) & Permission.author_permissions
      scope :admins, joins(:permissions) & Permission.admin_permissions

Permission.rb内:

    class Permission < ActiveRecord::Base
      scope :author_permissions, where("role_id = ?", Role.find_by_rolename("author"))
      scope :admin_permissions, where("role_id = ?", Role.find_by_rolename("administrator"))

そして出来上がり!今、私は呼び出すことができUsers.authors、それは魅力のように機能します。

4

2 に答える 2

3

使用しているスキーマ構造を保持しますが、適切なテーブルインデックスを追加してください。

次に、特定の役割のユーザーを照会するために実行できます

User.all(:joins => :roles,
         :conditions => {:roles => {:id => pick_a_role_id}})
于 2012-05-14T01:45:05.173 に答える
2

CanCanを見たことがありますか?主にcurrent_userメソッドを作成するために、おそらく少しリファクタリングが必要になります。役割のガイドはここにあります

于 2012-05-13T23:49:57.220 に答える