2011-03-08 139 views
0

現有型號:Rails:擁有管理員和管理員以及用戶的組織

class Organization < ActiveRecord::Base 
 has_many :admins 
 has_many :users, :through => :admins 

class User < ActiveRecord::Base 
 has_many :admins 
 has_many :organizations, :through => :admins 

無汗。 @org.users返回管理員用戶列表。

現在我需要添加另一個角色:版主。我不能在中間添加另一個表(因爲一個關聯只能有一個目標)。

一位朋友建議我讓版主多態。我在Rails指南中讀到了這一點,但不知道如何在這裏實現它。

我試過這個:

class Moderator < ActiveRecord::Base 
    belongs_to :modable, :polymorphic => true 
end 

...然後將其添加到我的用戶和組織模型:

has_many :moderators, :as => :modable 

從技術上講這可行,但是,我無法讓我的用戶這個的。我試圖在主持人表中添加一個user_id列,但沒有關聯,Rails不想抓住它:

> @org.moderators.joins(:users) 
ActiveRecord::ConfigurationError: Association named 'users' was not found; perhaps you misspelled it? 

任何幫助都非常感謝。謝謝!

UPDATE

結束於此(注意:主持人被稱爲「網絡用戶」):

class Organization < ActiveRecord::Base 
    has_many :roles 
    has_many :users, :through => :roles 

    has_many :admin_roles, :conditions => {:role_type => "AdminRole"} 
    has_many :admins, :through => :admin_roles, :source => "user", :class_name => 'User' 

    has_many :network_user_roles, :conditions => {:role_type => "NetworkUserRole"} 
    has_many :network_users, :through => :network_user_roles, :source => "user", :class_name => 'User' 

# This all lives in one table; it has a organization_id, user_id, and special_role_type columns 
class Role 
 belongs_to :organization 
 belongs_to :user 
end 

class AdminRole < Role 
end 

class NetworkUserRole < Role 
end 

class UserRole < Role 
end 
+0

你原來的關聯對我來說似乎沒有多大意義。 @ org.users如何產生管理員用戶(除非你的所有用戶都是不太可能的管理員)?管理員似乎是組織和用戶模型之間似乎是多對多的聯合模型。 – Shreyas 2011-03-08 19:34:10

+0

爲什麼不把用戶的角色存儲在一個字段中?有一個傳統的管理類嗎? – justinxreese 2011-03-08 20:11:39

+0

工作正常(或者我認爲?),因爲:has_many:users,:through =>:admins - 當我打電話給用戶時,它會加入管理員,然後加入用戶。 – jmccartie 2011-03-08 20:26:38

回答

0

我不知道我知道你在這裏做什麼,但。 ..它看起來像你對我會想:

class Organization < ActiveRecord::Base 
    has_many :users 
    has_many :admins, :through => :users 
    has_many :moderators, :through => :users 
1

我認爲你正在尋找的東西更像

class Organization < ActiveRecord::Base 
    has_many :users 
    has_many :admins 
    has_many :moderators 
    has_many :admin_users, :through => :admins, :class_name=>"User" 
    has_many :moderator_users, :through => :admins, :class_name=>"User" 

class Admin < ActiveRecord::Base 
    has_many :organizations 
    belongs_to :user 

class Moderator < ActiveRecord::Base 
    has_many :organizations 
    belongs_to :user 

class User < ActiveRecord::Base 
    has_many :organizations 
    has_many :admins 
    has_many :moderators 

基本上,管理員不是組織和用戶之間的橋樑(反之亦然)沒有意義。一個組織擁有管理員,一個組織擁有用戶,一個組織擁有主持人。當用戶擁有管理員(在某些用戶是管理員的意義上)時,用戶與組織的關係不應該通過管理員,尤其是對於不是管理員的用戶。

我認爲更好的方法是添加一個新模型,如OrganizationRole,它將加入組織和角色(如管理員或主持人)。這樣,當有人出現並宣佈組織必須有祕書或網站管理員或其他人時,您不必修改所有現有模型。

相關問題