2009-10-21 93 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

相关问题