2016-05-27 8 views
3

私はStaffというモデルがあるとします。 staffオブジェクトは、ユーザーに添付され、「タイトル」を持ちます。今、このタイトルはマネージャー、医者、エンジニア、看護士のいずれかになります。どちらが良い練習ですか?どちらが良いですか:Railsの定数またはモデル

は、定数を宣言し、スタッフモデル自体

ROLES = ["manager", "doctor", "engineer", "nurse"]

またはRoleと呼ばれるモデルを作成し、Staffモデルとの関係として、それを設定するにtitle属性を持っていますか?このモデルはONLYにはtitleという属性があります。

私は両方がうまくいくことにはかなり気づいていますが、私は皆さんにこの人物に関する将来の見通しや考えを伝えたいと思います。

ありがとうございます!

+0

Staff#titleをお持ちの場合、なぜ定数が必要ですか? –

+0

youre右それは非常に混乱しています。私が言っていることは、スタッフがタイトルを持っていなければならず、それを正しくコーディングする方法を知りたいということです。スタッフモデル自体にtitle属性を追加するか、title属性を持つroleという名前の関係を作成する必要があります – user3620046

答えて

9

ロールシステムが簡単な場合、1つのフィールドで別のモデルを作成する必要はありません。私はあなたがレールActiveRecord#enumを見てお勧めします、その機能を実装するために

:あなただけStafftitle属性をしたいようhttp://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

2

が鳴ります。

あなたは、そのタイトルが「許可」の値のいずれかであることを確認したい場合は、モデルレベルに含めることを検証することができます。

validates :title, inclusion: { in: %w(manager doctor engineer nurse) } 
2

これは完全にユースケースに依存します。あなたのアプリケーションのユーザーが1つの役割しか果たしていないことを予見できれば、Sergiiが提案するようにenumを使用してください。これは、最も単純で最も効果的なオプションになるでしょう。

また、実際に認可の役割システムが必要かどうか、またはユーザーが自分の好みに合わせて自分自身のタイトルを付けることができないかどうかだけでも判断できます。

ユーザーが複数の役割を果たすことができる柔軟なシステムが必要な場合は、データベーステーブルを使用したい場合や、太字の場合はネイティブ配列タイプを使用することもできます。

もう1つの質問は、どのように役割が作成されるかです。開発者の関心事です。 GUIからロール定義を作成できる必要がありますか?

この例では、ロール定義のテーブルと、ユーザーに割り当てられたロールを含む結合テーブルを使用した一般的なセットアップを示します。

class User < ActiveRecord::Base 
    has_many :user_roles 
    has_many :roles, through: :user_roles 

    def has_role?(name, resource = nil) 
    scope = user_roles.joins(:role).where(
     role: { name: name } 
    ) 
    scope = scope.where(resource: resource) if resource 
    scope.any? 
    end 
end 

# join table with roles assigned to users 
class UserRole < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    belongs_to :resource, polymorphic: :true 
end 

# Role definitions 
class Role < ActiveRecord::Base 
    has_many :user_roles 
    has_many :users, through: :roles 
end 
1

常に小さなものから始め、必要に応じてテストを緑色にしてからリファクタリングしてください。

あなたが唯一の人々のための役割を定義したい場合は、それはあなたが考えと同じくらい簡単です:Staffモデルで

  • 新しい属性title
  • Staffモデルテーブルに新しい定数 TITLES
  • Staffモデルでの新しい検証。@petr-gazarov

新しいモデルが必要な場合は、必ずリファクタリングするだけです。選択肢がある限り、答えは常に最も簡単です。

すぐに、あなたはこの役割の差別化で何をしたいのかを尋ね始めるかもしれません。承認についてもっと知りたいと思うかもしれません(例えば、 "何ができるか" )。
私は1つの石で2羽の鳥を殺し、role-based authorizationの良いガイドにリンクしています。ロールベースの認可を定義するための非常に簡単で機能的な宝石です。cancancan

関連する問題