0

has_manyスルー リレーションシップを実装するために 3 つの異なる方法を行ったり来たりしていますが、どれが最適かを判断するための助けが必要です。

基本的なレベルContributorでは、個人の詳細を保持するProjectモデルがあり、貢献者が貢献できるモデルがあります。彼らはさまざまな方法で貢献できます。aContributorは、編集者、著者、作曲家、研究者などになることができます。Contributor は、複数の方法で同じものに貢献できProject(たとえば、作曲家や編集者になることができます)、複数の に貢献できますProjects

という結合モデルを設定しましたContributorship。私の質問は、次に何をするかです。私が見る限り、3つのオプションがあります:

  1. contribution_typeコントリビューションのタイプを保持する属性をContributorship(事前定義された列挙から) に追加します。との関係を設定するときContributorProjectこれを適切な値に設定します。

  2. で、貢献の種類ごとに 1 つずつ、複数のhas_many through関係を作成します。Projectそれぞれが に解決されContributorますが、 で異なる外部キーを使用しContributorshipます。

  3. 捨てて、Contributorship複数の結合モデルなどに置き換えます。これらはすべて に解決されます。EditorAuthorContributors

4

3 に答える 3

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間違いなく最初のオプションですが、 3 つのモデルContributorを関連付けContributionTypeますContributorship

これにより、現実に最も近い表現が得られ、最終的には将来の動き (モデルの複雑化、承認など) で一般的な自由が得られます。

于 2013-10-15T23:26:02.877 に答える