2012-10-16 63 views
1

A Group實例可以包含Person實例或其他Group實例。我想使用祖先的寶石來反映一個層次結構,但祖先似乎沒有與兩種不同的模型一起工作。我不想在PersonModel上使用單表繼承,因爲它們在概念上是不同的。Rails 3:將模型組和成員建模爲層次結構

什麼是最好的方式去建模這個要求?我願意使用多對多或其他類型的關聯來構建我自己的層次結構,但我不知道如何讓這兩個模型(PersonGroup)彼此搭配很好。

謝謝。

回答

1

您可以輕鬆地設置在集團類層次結構(使用任何適合你的單一模式的層次結構),然後添加組和用戶之間的一個一對多的關聯關係:

class Group < AR::Base 
    acts_as_tree # or whatever is called in your preferred tree implementation 
    has_many :users 
end 

class User < AR::Base 
    belongs_to :group 
end 

您將有

@group.children # => a list of groups 
@group.parent # => another group or nil if root 
@group.users # => the users directly below this group 
@user.group  # => a group 

如果您確實需要該組具有用戶或子組,但不能同時使用,則使用驗證規則。

1

聽起來像你想要使用多態關聯。見一個簡單的例子導軌導向:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

編輯更新包括層次:

聽起來像是你需要幾個新型號,「水平」和「孩子」,例如:

組型號:

has_many :children, :as => :groupable 
belongs_to :level 

角色模型:

has_many :children, :as => :groupable 

級別型號:

has_many :children 
has_one :group 

attr_accessible :level (integer) 

兒童型號:

belongs_to :groupable, :polymorphic => true 

它可能會通過將兒童和層次模型來簡化這一點,但我不知道是否ActiveRecord的可以處理兩個關係在兩張桌子之間(一組爲兒童組,其中一組爲父母,聽起來總是一組)

您的層級將反映在level級別模型中的整數。

+0

那麼'Group'會包含多態相關的列嗎?此外,我怎樣才能得到一個層次結構呢? – RailinginDFW