我正在研究Rails 3中的新应用程序,但我不确定如何构建模型之间的关系。
基本上我有model User
和model Project
。用户可以创建项目,成为项目所有者。但是项目所有者以外的任何其他用户也可以加入此项目,但作为团队成员。
我是否需要为此团队关系创建新模型?这一切之间的关系怎么样?
提前致谢。
答案 0 :(得分:1)
查看关于关联(关系)的Rails Guide。
有很多方法可以根据自己的优点和缺点进行设置。通过阅读上面的指南,您可以很好地理解各种可用选项。
您可能最终会得到一个多对多关联(一个项目可以有很多用户,一个用户可以有很多项目)。您有两个主要选择:has_and_belongs_to_many
或has_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
模型会更复杂。
总体而言,我认为在User
和Project
之间建立“多对多”关系,并为每个项目向用户(如管理员,参与者等)“分配”角色更有意义
答案 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
对象来加入项目,同时仍然维护单个所有者。