0

私は自分の問題を達成するための最良の方法を見つけようとしています。pages テーブルと user_types テーブルがあります。ページで複数のユーザー タイプを指定しようとしています。これらは権限グループとして機能します。ただし、これを2回行う必要があります。1 回は読み取り権限用、もう 1 回は編集権限用です。次に例を示します。

ホームページには、それを読み取ることができる 3 つのユーザー タイプ (管理者、スーパー管理者、公開) があります。それを編集できる 2 つのユーザー タイプ (管理者、スーパー管理者) があります。

user_types テーブルが 1 つあります: admin super admin public など

2 つのマッピング テーブル (読み取り用と編集用) を作成しました。

どちらも page_id と user_type_id を持っています

これを達成するためのより良い方法はありますか?これが最善の方法である場合、モデルの関係を理解する助けが必要です。私はこれを1つの関係のために持っています

  has_and_belongs_to_many :user_types, :join_table => :pages_user_read_types

別々のフィールドに 2 つの関係を指定するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

少なくとも、Permissionモデルを追加したいと思うでしょう。説明した内容よりも複雑になった場合は、CanCanの使用もお勧めします。

class Permission < ActiveRecord::Base
  #table is id, page_id, user_type_id, and permission_type (string).
  belongs_to :page
  belongs_to :user_type
end

コントローラーでは、次のようにフィルター チェーンを構築できます。

class PagesController < ApplicationController
  before_filter :load_page
  before_filter :authorize_view!, only: [ :show ]
  before_filter :authorize_edit!, only: [ :edit ]

  def show
  end

  def edit
  end

  private
    def load_page
      @page = Page.find(params[:id])
    end

    def authorize_view!
      if !@page.permissions.where(user_type_id: current_user.user_type_id, permission_type: "view").exists?
        flash[:notice] = "You do not have permission to view that page."
        redirect to root_path
      end
    end

    def authorize_edit!
      if !@page.permissions.where(user_type_id: current_user.user_type_id, permission_type: "edit").exists?
        flash[:notice] = "You do not have permission to edit that page."
        redirect to root_path
      end
    end

end

(これは、アプリにメソッドがあることを前提としていcurrent_userます)。

于 2012-10-22T03:35:41.237 に答える
1

Rails での HABTM 関係は、この数年間、Rails 開発者との関係に好意的ではなくなったようhas_many :throughです。HABTM を使用する必要があるのは、2 つのモデル間の関係に関する追加情報が必要ない場合のみです。あなたの場合、編集可能な属性を持つ結合モデルを持つことで効果的に達成できるときに、2 つの HABTM 関係を作成することでこれをエミュレートしようとしています。

コードでは、次のようになります。

class Page < ActiveRecord::Base
  has_many :page_permissions
  has_many :user_types, :through => page_permissions

  def editable_user_types
    page_permissions.includes(:user_types).where(:editable => true).map(&:user_type)
  end

  def read_only_user_types
    page_permissions.includes(:user_types).where(:editable => false).map(&:user_type)
  end      
end

class PagePermission < ActiveRecord::Base
  belongs_to :page
  belongs_to :user_type
  # When you create this model, you should have a boolean attribute for editable
end

class UserType < ActiveRecord::Base
  has_many :page_permissions
  has_many :pages, :through => :page_permissions
end

このアプローチに従うと、 PageUserTypeの間の関係 ( PagePermission )に追加の属性を追加する必要がある場合に、1 つの結合テーブルに統合できるようになると思います。

于 2012-10-22T03:38:23.513 に答える