Ruby on Rails中的模型关系

时间:2011-04-26 00:48:29

标签: ruby-on-rails-3 relationship

我正在研究Rails 3中的新应用程序,但我不确定如何构建模型之间的关系。

基本上我有model Usermodel Project。用户可以创建项目,成为项目所有者。但是项目所有者以外的任何其他用户也可以加入此项目,但作为团队成员。

我是否需要为此团队关系创建新模型?这一切之间的关系怎么样?

提前致谢。

4 个答案:

答案 0 :(得分:1)

查看关于关联(关系)的Rails Guide

有很多方法可以根据自己的优点和缺点进行设置。通过阅读上面的指南,您可以很好地理解各种可用选项。

您可能最终会得到一个多对多关联(一个项目可以有很多用户,一个用户可以有很多项目)。您有两个主要选择:has_and_belongs_to_manyhas_many :through。第一个是最“自动化”,但后者提供更多控制。后者是我个人的偏好。

就像我说的那样,阅读导轨指南,以便了解您的选择。

答案 1 :(得分:1)

因此,绘制您的模型图表我希望您拥有以下内容:

User --< UserProject >-- Project

这意味着用户可以与许多项目相关联,并且项目可以与拥有1个所有者的许多用户相关联。然后你的表格会有:

mysql> desc users;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

mysql> desc projects;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

mysql> desc user_projects;    
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| user_id       | int(11) | YES  |     | NULL    |       |
| project_id    | int(11) | YES  |     | NULL    |       |
| project_owner | int(1)  | YES  |     | NULL    |       |
+---------------+---------+------+-----+---------+-------+

您的模型将如下所示:

class User < ActiveRecord::Base
  has_many :user_projects
  has_many :projects, :through => :user_projects
end

class UserProjects < ActiveRecord::Base
  belongs_to :users
  belongs_to :projects
end

class Projects < ActiveRecord::Base
  has_many :user_projects
  has_many :users, :through => :user_projects
end

这应该足以让你开始

答案 2 :(得分:0)

听起来像Project模型将同时拥有“belongs_to:user”(项目管理员)和“has_many:users”(参与者)。我个人从未尝试过。同时User模型会更复杂。

总体而言,我认为在UserProject之间建立“多对多”关系,并为每个项目向用户(如管理员,参与者等)“分配”角色更有意义

答案 3 :(得分:0)

我正在使用具有共享权限的照片库做类似的事情。这是我给出的结构(虽然这是从另一个项目改编而来,但可能不完全正确)。

class User
  has_many :projects, :foreign_key => "owner_id"
  has_many :project_memberships, :foreign_key => "member_id"
  has_many :shared_projects, :class_name => "Project", :through => :project_memberships, :foreign_key => "member_id"
end

class ProjectMembership
  belongs_to :member, :class_name => 'User'
  belongs_to :project
end

class Project
  belongs_to :owner, :class_name => "User"
  has_many :project_memberships
  has_many :members, :class_name => "User", :through => "project_memberships", :foreign_key => "member_id"
end

基本上,这允许项目既拥有用户的所有者又拥有许多也是用户的其他成员,并且可以单独访问它们。这些是使用has_many :through关系相关的,我们基本上给出了一个比默认has_many :users给我们更有意义的名称。

这也使个别成员能够通过为所述项目创建新的project_membership对象来加入项目,同时仍然维护单个所有者。