2009-10-21 72 views
2

對不起,模糊的標題,但這是很難把一條線。我應該如何使用Ruby on Rails構建此應用程序?

我有一個數據庫充滿了聯繫信息,我希望能夠將這些不同的聯繫人分組,這些聯繫人也將存儲在數據庫中。

因此,也許我有2個組,「同事」和「鄰居」,我希望能夠看到我所有聯繫人的列表,並能夠將單個聯繫人添加到一個或多個組。

我有點困惑,因爲從哪裏開始,我可以得到一些基本的輪廓如何最好地實施?謝謝。

回答

2

那麼,你有兩個模型,聯繫人和組。這兩個人顯然會有自己的表(如果你遵循Rails約定,可能是'聯繫人'和'組')。由於聯繫人可以在多個組中,並且一個組可以有很多聯繫人,所以這些模型之間存在所謂的多對多關係。基本上有兩種方法可以在Rails中實現:has_and_belongs_to_manyhas_many :through。哪一個最適合你,將取決於你的情況。

has_and_belongs_to_many可能是阻力最小的路徑。你把一對夫婦行你的模型像這樣:

# contact.rb 
has_and_belongs_to_many :groups 

# group.rb 
has_and_belongs_to_many :contacts 

...並創建一個名爲「contacts_groups」同列contact_idgroup_id表,你基本上好去。十分簡單。

另一方面,與has_many :through使用關聯模型有一些優點。在這種方法中,您將創建另一種模式,比如說,GroupMembership,並設置你的模型像這樣:

# contact.rb 
has_many :group_memberships # this isn't strictly required, but I'd recommend it 
has_many :groups, :through => :group_memberships 

# group_membership.rb 
has_many :groups 
has_many :contacts 

# group.rb 
has_many :group_memberships # again, recommended but not required 
has_many :contacts, :through => :group_memberships 

這給你最一樣方便的方法爲has_and_belongs_to_many,也可以讓您存儲您可能任何額外的數據想要了解這個協會,就像他們加入該組織的日期或他們加入的原因一樣。即使您現在還沒有這些功能,但考慮到稍後添加它的可能性也不錯。此外,如果您感興趣的話,這可以讓您採用更加REST風格的方式來添加和刪除聯繫人,因爲您可以通過創建和銷燬GroupMembership資源來對其進行建模。總的來說,我傾向於傾向於後一種方法,尤其是當我更多地使用RESTful體系結構時,我傾向於採用後一種方法。另一方面,如果您不擔心REST,並且您確定永遠不想保留關於成員身份的任何額外信息,則has_and_belongs_to_many可能更簡單,並且需要的代碼更少才能正常工作。有關差異和實施細節的更多深入信息,請參閱ActiveRecord Associations API docs

0

你可以構建一個Ruby on Rails的數據庫是:

Contact (first_name:string, last_name:string, title:enum number:string, cell:string, notes:text, email:string) => many_many :groups (or has_many :groups, :through=> :contact_group) 
Contact_Group { group_id:integer, contact_id:integer } 
Group (name:string) => many_many :contacts) (or has_many :contacts, :through=> :contact_group) 

這可能是一般的想法。你也可以做關係字段。

0

您不想使用has_and_belongs_to_many方法。它已被棄用。請閱讀API並確保你實現了一個連接模型/ has_many:through方法。該API會告訴你如何做到這一點,並提到爲什麼has_and_belongs_to_many不好。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+1

我上has_and_belongs_to_many看到的唯一的棄用是定義在連接表的字段添加爲屬性對象通過協會(這的確會建議你想一個真正的連接模型代替)拉。事實上,你鏈接到的API聲明:「[c]建立多對多關係的方法並不總是很簡單,如果你需要將關係模型作爲自己的實體,使用has_many:through。Use has_and_belongs_to_many when ...你從不直接與關係本身打交道。「這就是說,在大多數情況下,我傾向於加入模型。 – 2009-10-22 21:39:04

相關問題