は、ここでの役割せずに基本的なモデルです。Rails 5の異なるグループのユーザ役割を割り当てるための最良の方法は?
グループモデル
class Group < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
end
ユーザモデル
class User < ApplicationRecord
has_many :memberships
has_many :groups, through :memberships
end
メンバーシップモデル
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
end
各グループは、1(1つのみを持つべきです)owner
、複数のadmins
(オーナーが割り当てられます)、およびgeneral
のメンバーです。また、所有権の役割は、である必要があります。私のオプション、私はそれらを見るように:
メンバーシップのテーブルの上に単一の属性
role
を作成し、それを「所有者」、「管理者」、または「一般」の文字列値を割り当てます。 [悪い]メンバーシップテーブルの "owner"、 "manager"、 "general"に複数のブール値を作成します。 [悪い]
は次にようなので、私のモデルを更新する1列( "名前")および3列( "所有者"、 "管理者"、 "一般的な")と
Role
モデル/テーブルを作成します。
役割モデル
class Role < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
has_many :groups, through :memberships
end
群モデル
class Group < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
has_many :roles, through :memberships
end
ユーザモデル
class User < ApplicationRecord
has_many :memberships
has_many :groups, through :memberships
has_many :roles, through :memberships
end
メンバーシップモデル
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
belongs_to :role
end
- 直接群モデルでさまざまな役割のために別々のアレイを作成します。役割を更新するには複数の配列のプッシュとスプライシングが必要になり、単純なメンバーシップのリストを提示するためには複数の配列を連結する必要があるため、これは本当に馬鹿げているようです。
グループモデル
class Group < ApplicationRecord
has_many :general_memberships, class_name: 'Membership'
has_many :admin_memberships, class_name: 'Membership'
has_one :owner_membership, class_name: 'Membership'
has_many :users, through :memberships
end
ユーザモデル
class User < ApplicationRecord
has_many :general_memberships, class_name: 'Membership'
has_many :admin_memberships, class_name: 'Membership'
has_many :owner_memberships, class_name: 'Membership'
has_many :groups, through :memberships
end
メンバーシップモデル
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
end
私はCanCanCan(Railsの5互換性がありますか?)とGroupifyのようにそこに宝石がある知っていますしかし、私は最初にすべてのオプションを理解したいと思っています。私はオプション#3は、少なくとも宝石を利用することなく、おそらく私の最高の最高だと思う。自分のシナリオでコミュニティがベストプラクティスと考えていることを思い出してください。
は何を見つけましたか? –
下の私の答えを参照してください – MattD