Rails多对多关系困境

时间:2013-07-26 22:23:29

标签: ruby-on-rails database-design

我有一个用户模型:

class User < ActiveRecord::Base
  has_many :projects, dependent: :destroy
end

和项目模型:

class Project < ActiveRecord::Base
  belongs_to :user
end

如果我希望User能够为Projects提供资金,Project可以由多名Users资助,我该怎么办?

这意味着我会得到一对多关系,我需要一个额外的中间表。称之为user_projects

class UserProject < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

但在实施第三个模型之前,我如何应对模型之间的先前关系呢?

如果我有中间表,我如何知道哪个项目属于哪个用户?

我会按以下方式修改表吗?

class User < ActiveRecord::Base
  has_many :projects, through: :user_project, dependent: :destroy
  has_many :user_projects
end

class Project < ActiveRecord::Base
  has_many :user_projects
  has_many :users, through: user_project
end

1 个答案:

答案 0 :(得分:0)

您是否需要中间表取决于您是否需要存储与用户/项目对相关的任何数据 - 例如美元金额或日期信息或角色等。

如果您不需要存储任何其他内容,则只需使用HABTM关系即可。否则,您的最终解决方案将是可行的方法。

我个人不喜欢'user_project'的选择,因为它太靠近HABTM的'users_projects'了。也许像ProjectMember或ProjectFunder或Funding这样的东西会更好,但这取决于你需要存储多少额外数据。