0

我在三种不同的方式来实现has_many直通关系之间来回切换,我需要一些帮助来决定哪种方式最好。

在基本层面上,我有Contributor保存个人详细信息的Project模型,并且我有一个贡献者可以贡献的模型。他们可以通过多种不同的方式做出贡献;aContributor可以是编辑、作者、作曲家、研究员等。贡献者可以以多种方式为同一人做出贡献Project(例如,他们可以是作曲家和编辑),并且他们可以为多个Projects.

所以我建立了一个名为Contributorship. 我的问题是下一步该怎么做。据我所知,我有三个选择:

  1. 添加一个包含贡献类型的contribution_type属性(来自预定义的枚举)。Contributorship当我建立 和 之间的关系时ContributorProject我将其设置为适当的值。

  2. 在 上创建多个has_many through关系Project,每种类型的贡献一个。每个仍然解析为 a Contributor,但在 上使用不同的外键Contributorship

  3. 抛弃Contributorship并用多个连接模型替换它 -Editor等等Author,它们都解析为Contributors.

4

3 回答 3

2

选项 1 听起来简洁明了。它还允许您在一个查询中获取所有贡献者,而不管其类型如何。而且您始终可以在 Project 上创建查找器方法以仅获取编辑者或作者。它还允许非常容易地添加贡献类型。

选项 2 和 3 会起作用,但比第一个选项更严格。它们还需要创建更多的表和模型类。

我的建议:选择现在可行的最简单的解决方案,然后等到出现需要更复杂关系的新要求。

于 2013-10-15T13:45:51.507 回答
2

我会选择第一个选项。此外,我会在项目上定义方法以便于访问。

class Project < ActiveRecord::Base
  # ... relations defined
  Contributorship::TYPES.each do |c_type|
    define_method c_type do
      contributors.where( "contributorship.contribution_type" => c_type )
    end
  end
end
于 2013-10-15T13:57:43.923 回答
1

你害怕ContributionType模特吗?

绝对是第一个选择,但我会通过模型关联三个模型:和(新模型Project,而不是枚举)。ContributorContributionTypeContributorship

这为您提供了最接近现实的表示,并最终在未来的任何移动(模型复杂化、授权等)中提供了通用自由。

于 2013-10-15T23:26:02.877 回答