我想知道我是否在正確的軌道上,如果軌道允許這種事情。Rails has_many:通過,歸屬belongs_to,多個belongs_to並刪除belongs_to?
User
有一個Role
在Network
。即「吉姆」是「學校」中的「歷史教師」。
A Role
同時具有位置(功率)和名稱(標籤)。 「吉姆」是一名「歷史教師」(標籤),但具有成員或管理員,主管或任何權力的權力。
根據Role
的不同,User
可以在Network
中看到全部Events
,無論他/她是否創建了它們。即如果「Jim」是「Principal」(管理員),而「Jim」是「歷史教師」(成員),則「Jim」可以看到「Nancy的」「Recess Plan」。
A User
在Network
內創建Event
作爲Role
。即「吉姆」在「學校」創建「課程計劃」作爲「歷史教師」。
Event
永遠連接到那個特定的Network
,並且目前是那個Role
。
我想這Event
堅持如果User
取代另一個User
在Role
,新User
可以訪問Event
。即「湯姆」代替「吉姆」作爲「歷史教師」,並可以修改「教案」,因爲他是「歷史教師」。 「Jim」無法再訪問「課程計劃」。
但是,如果沒有User
附加到Role
,我也希望Event
持續。即「湯姆」被解僱,並且目前沒有替換,管理員仍然可以看到「課程計劃」。
最後,如果該Role
被刪除,Event
仍然存在連接到Network
沒有Role
。
型號有以下,我使用慘慘的授權,而這些是我的問題:
- 能作用缺少一個
User
,或者我需要創建一些通用的「無」User
或者「每個人「User
?並且Event
可能會丟失Role
? (可否屬於空?) - 將
Event
連接到Role
和Network
是好還是不好設計?有一個更好的方法嗎? - 如果一個
User
可以看到更多的事件,具體取決於他/她的Role
他們有很多Events
到Network
或他們的Role
?我想通過Network
和Ability.rb會限制它。
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
網絡。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
你的問題真的很重 - 你可以通過將問題分解成更容易解釋的小問題來得到更好的迴應 – aguynamedloren
謝謝,將會做到。我一直在想如何做到這一點,並不確定,但生病嘗試。 – dewyze