Rails HABTM和belongs_to用于关联用户/项目

时间:2011-06-27 10:14:15

标签: ruby-on-rails associations has-and-belongs-to-many

我有一个UserProject型号。用户可以拥有多个项目,项目可以拥有多个用户。当然,这与has_and_belongs_to_many关联很简单。我的问题是我还想跟踪创建项目的用户。对于我的belongs_to :user模型,Project这很简单。那么问题是当用户已经与has_many :projects建立HABTM关系时,为User执行Project毫无意义。

这是我最终想要实现的目标:

# building a project with the currently logged in user
current_user.projects.build(...)

# now when a user wants to add another user to this project
project = current_user.projects.find(...)
project.users << User.find(...)

# grabbing information
some_project.user  #=> The user who created this project
some_project.users #=> The array of User objects associated
some_user.projects #=> The array of Project objects associated

将来,User可能会与Group具有相同的关系,其中User会有很多并属于多个群组。但我还要跟踪此Group创建者

我很可能错过了一些东西。实现这一目标的常用方法是什么?

如果有助于澄清,可能的配置如下:

    • has_and_belongs_to_many:用户
    • belongs_to:user
    • has_many:projects
    • 只有User才能创建Group
  • 用户
    • has_and_belongs_to_many:groups
    • has_many:projects
    • 可以是一个团队或项目,也可以同时属于
  • 项目
    • has_and_belongs_to_many:用户
    • belongs_to:group
    • UserGroup都应该能够创建Project

我还尝试为每个关联做一个简单的has_and_belongs_to_many,例如包括creator_id,并自己跟踪。例如.. Project.create(:creator_id => current_user.id),但这似乎是hackish,我相信他们会更好地做到这一点。如果我遗漏了一些简单的东西,请为我的无知道歉。

1 个答案:

答案 0 :(得分:1)

再次阅读本文,您希望拥有该项目的一个所有者,无论是组还是用户。将其存储为项目模型中的多态belongs_to关系。即。 owner_type =&gt; '用户'/'群组'owner_id =&gt; 123

与该群组相关联的其他用户是多对多的,因此您需要一个联接表。

您的群组模型是一个单独的模型,与用户有多对多的关系,因此您只需将创建它的用户存储为群组模型的字段,即。 :user_id 123。