0

次の状況に必要な関連付けを理解するのに苦労しています。

  • 「人」、「グループ」、「プロジェクト」、または「オフィス」のいずれかに添付できる「アップロード」があります。

  • アップロードは、同時に複数の人、グループ、またはプロジェクトに属する必要があります(つまり、2 人、3 つのプロジェクト、1 つのグループ、2 つのオフィスにリンクできます)。

  • 個人、プロジェクト、グループ、またはプロジェクトには、複数のアップロードを関連付けることができます。

  • オブジェクトに関連付けられたすべてのアップロード (例: @project.uploads) と、アップロードがリンクされているすべてのアイテム (@upload.linked_to などの単一のメソッド) を取得できるようにしたいと考えています。

将来的にアップロードをリンクしたい他のモデルがあるかもしれないので、より柔軟にしたいので、可能な関連付け (projects_uploads、people_uploads、office_uploads) ごとにテーブルを作成しないようにしています。

ポリモーフィックな関連付けが必要かもしれません...しかし、私が達成しようとしているものとまったく同じ例は見つかりませんでした。

誰かが私を正しい方向に向けることができますか?

ありがとうございました!必要に応じて、質問を明確にすることができます:)

編集: 解決しました!これは私がそれを設定した方法です:


モデル

Upload.rb

class Upload < ActiveRecord::Base

  has_many :upload_connections

  def linked # Shortcut for @upload.upload_connections
    self.upload_connections
  end

end

Upload_connection.rb

class UploadConnection < ActiveRecord::Base

  belongs_to :uploadable, :polymorphic => true
  belongs_to :upload

end

Project.rb / Office.rb / Person.rb など

class Project < ActiveRecord::Base 
# (same for project, office, person, etc.)

  has_many :upload_connections, :as => :uploadable
  has_many :uploads, :through => :upload_connections

end

テーブル構造

アップロード

id: integer
filename: string
description: string

Upload_connections

id: integer
uploadable_id: integer
uploadable_type: string
upload_id: integer

... さらに、それらを関連付けるオブジェクトのテーブル。

4

1 に答える 1

1

ポリモーフィックな関連付けは、あなたが望むものです。関連付けごとに個別のテーブルが必要だとは思いません。それはただ面倒になります。

class Upload << AR
  has_many :links
  has_many :users, :through => :links, :conditions => {:mediable_type => 'User'}
end

class Link << AR
  belongs_to :upload
  belongs_to :linkable, :polymorphic => true
end

class User << AR # and Project, Group, and Office
  has_many :links, :as => :linkable
  has_many :uploads, :through => :links
end

FWIW、「リンク」はひどい名前ですが、今のところこれ以上の名前は思いつきません。また、私の構文の一部がオフになっている可能性がありますが、十分に近いはずです。

于 2013-07-20T19:06:17.190 に答える