【问题标题】:Model Relations in Ruby on RailsRuby on Rails 中的模型关系
【发布时间】:2011-04-26 00:48:29
【问题描述】:

我正在 Rails 3 中开发一个新应用程序,但我不确定如何建立模型之间的关系。

基本上我有一个model User 和一个model Project。用户可以创建项目,成为项目所有者。但是除了项目所有者之外的任何其他用户也可以加入这个项目,但作为团队成员。

我需要为这种团队关系创建一个新模型吗?而这一切之间的关系又会如何呢?

提前致谢。

【问题讨论】:

    标签: ruby-on-rails-3 relationship


    【解决方案1】:

    我正在对具有共享权限的照片库做类似的事情。这是我给它的大致结构(虽然这是从另一个项目改编的,所以可能不完全正确)。

    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 对象来加入项目,同时仍保持单一所有者。

    【讨论】:

    • 感谢您的回答。您在路线上使用的资源如何?
    • devise_for:用户和资源:项目,资源:project_memberships
    【解决方案2】:

    查看此Rails Guide 上的关联(关系)。

    有多种设置方法,每种方法各有利弊。通读上面的指南应该会让您对可用的各种选项有一个很好的了解。

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

    就像我说的,请阅读 rails 指南,以便了解您的选择。

    【讨论】:

    • 感谢您的回答和链接。阅读它我不得不同意has_many :through 看到了最好的。我仍然有疑问:用户模型应该有一个has_many :through 和一个has_many,而Project 应该有一个belongs_to 对吗?还是我犯了什么错误?再次感谢。
    【解决方案3】:

    所以绘制你的模型我希望你有以下内容:

    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
    

    这应该足以让你开始

    【讨论】:

    • 感谢您的回答。这样我就不需要 Project 模型为拥有它的用户提供一个 id 字段了吗?资源如何嵌套?再次感谢。
    • @Luk 我会让你去研究资源,因为有大量的文档,你可以很容易地在你的应用程序中使用它们。在此模型中,该项目不需要owner_id。不要忘记接受您的获奖答案!
    【解决方案4】:

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

    总的来说,我认为在UserProject 之间建立“多对多”关系并将角色“分配”给每个项目的用户(如管理员、参与者等)更有意义。

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多