私が正しい方向に進んでいるかどうか、そしてrailsがこの種のことを可能にするかどうかを知りたいです。
Userに1つRoleありNetworkます。つまり、「ジム」は「学校」の「歴史教師」です。
ARoleには、位置(パワー)と名前(ラベル)の両方があります。「ジム」は「歴史教師」(ラベル)ですが、メンバー、管理者、スーパーバイザー、またはその他(権限)の権限を持っています。
それに応じて、Role彼/彼女がそれらを作成したかどうかでUserすべてを見ることができます。つまり、「ジム」は「校長」(管理者)の場合は「ナンシー」の「休憩プラン」を見ることができますが、「ジム」が「歴史教師」(メンバー)の場合は見ることができません。EventsNetwork
Aは、内にとしてUserを作成します。つまり、「ジム」は「学校」で「歴史教師」として「教案」を作成します。EventRoleNetwork
EventNetworkその特定の、そして現在そのに永遠に接続されていRoleます。
その中の別のものを置き換えEventても、それを持続させたいのですが、新しいものはそれにアクセスできます。つまり、「トム」は「歴史の先生」として「ジム」を置き換え、「歴史の先生」であるため「教案」を変更することができます。「ジム」は「レッスンプラン」にアクセスできなくなりました。UserUserRoleUserEvent
ただし、にアタッチされていEventない場合は、を保持する必要もあります。つまり、「トム」が解雇され、現在の代替はありません。管理者は引き続き「レッスンプラン」を見ることができます。UserRole
最後に、それRoleが削除された場合でも、。なしでEvent接続されたまま存在します。NetworkRole
モデルは以下のとおりです。承認にCanCanを使用しています。これらは、私の質問です。
- 役割にが欠けている可能
User性がありますか、それとも一般的な「なし」Userまたは「全員」を作成する必要がありますかUser?そしてEvent、欠落している可能性がありRoleますか?(belongs_toをnullにすることはできますか?) - をaとaの
Event両方に接続するのは良い/悪い設計ですか?これを行うためのより良い方法はありますか?RoleNetwork User彼/彼女に応じてより多くのイベントを見ることができる場合、彼らはまたは彼らを通してRole多くを持っていますか?私は熟考していて、Ability.rbがそれを制限するでしょう。EventsNetworkRoleNetwork
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