私が正しい方向に進んでいるかどうか、そしてrailsがこの種のことを可能にするかどうかを知りたいです。
User
に1つRole
ありNetwork
ます。つまり、「ジム」は「学校」の「歴史教師」です。
ARole
には、位置(パワー)と名前(ラベル)の両方があります。「ジム」は「歴史教師」(ラベル)ですが、メンバー、管理者、スーパーバイザー、またはその他(権限)の権限を持っています。
それに応じて、Role
彼/彼女がそれらを作成したかどうかでUser
すべてを見ることができます。つまり、「ジム」は「校長」(管理者)の場合は「ナンシー」の「休憩プラン」を見ることができますが、「ジム」が「歴史教師」(メンバー)の場合は見ることができません。Events
Network
Aは、内にとしてUser
を作成します。つまり、「ジム」は「学校」で「歴史教師」として「教案」を作成します。Event
Role
Network
Event
Network
その特定の、そして現在そのに永遠に接続されていRole
ます。
その中の別のものを置き換えEvent
ても、それを持続させたいのですが、新しいものはそれにアクセスできます。つまり、「トム」は「歴史の先生」として「ジム」を置き換え、「歴史の先生」であるため「教案」を変更することができます。「ジム」は「レッスンプラン」にアクセスできなくなりました。User
User
Role
User
Event
ただし、にアタッチされていEvent
ない場合は、を保持する必要もあります。つまり、「トム」が解雇され、現在の代替はありません。管理者は引き続き「レッスンプラン」を見ることができます。User
Role
最後に、それRole
が削除された場合でも、。なしでEvent
接続されたまま存在します。Network
Role
モデルは以下のとおりです。承認にCanCanを使用しています。これらは、私の質問です。
- 役割にが欠けている可能
User
性がありますか、それとも一般的な「なし」User
または「全員」を作成する必要がありますかUser
?そしてEvent
、欠落している可能性がありRole
ますか?(belongs_toをnullにすることはできますか?) - をaとaの
Event
両方に接続するのは良い/悪い設計ですか?これを行うためのより良い方法はありますか?Role
Network
User
彼/彼女に応じてより多くのイベントを見ることができる場合、彼らはまたは彼らを通してRole
多くを持っていますか?私は熟考していて、Ability.rbがそれを制限するでしょう。Events
Network
Role
Network
User.rb
class User < ActiveRecord::Base
has_many :roles
has_many :networks, :through => :roles
has_many :events, :through => :network
# I would use CanCan to determine the authorization of
# what network events they can see based on their role?
end
Network.rb
class Network < ActiveRecord::Base
has_many :roles
has_many :users, :through => :roles
has_many :events
# it shouldn't have this through roles right?
# because a role can be deleted
end
Role.rb
class Role < ActiveRecord::Base
belongs_to :user #CAN THIS BE NULL?
belongs_to :network
end
Event.rb
class Event < ActiveRecord::Base
belongs_to :role #Can this be null?
belongs to :network
# Does it belong to the network through the role,
# or can it belong on its own, in case the role is deleted?
# belongs_to :user, :through => :roles
# Is this necessary if I am using CanCan
# to determine if a User can reach the event?
end
Ability.rb
if user
user.roles.each do |role|
can :manage, Event, :role_id => role.id
if role.position == "admin" || role.position == "manager"
can :manage, Event, :network_id => role.network_id
elseif role.position == "supervisor"
can :read, Event, :network_id => role.network_id
end
end
end