0

私は自分のファイルをAmazons3に保存しています。各ファイルには多くの「コンシューマー」があり、これらのコンシューマーは任意のタイプ(ユーザー、外部アプリ、business_listingsなど)にすることができます。これには、多対多の関係が必要です。ただし、各関係に関する特定の属性も保存したいと思います。したがって、これに取り組む最善の方法は、「s3_files」コンシューマーの間に*has_and_belngs_to_many_through*関係を作成することだと思います。

問題は、消費者のタイプが多いため、ポリモーフィックな関連付けを使用する必要があるということです。

したがって、これに基づいて、次の手順を実行します。

1) Create a model: "resource_relationship"
2) Have these fields in it:
  t.string: consumer_type
  t.string: s3_fileType
  t.string: file_path
  t.string: consumer_type
  t.integer: s3_file.id
  t.integer: consumer.id
  t.integer: resource_relationship.id
 3) Add to the model:
     belongs_to: s3_file
     belongs_to: consumer
 4) add_index:[s3_file.id, consumer.id]

 5) Inside: s3_file
     nas_many: resource_relationships
     has_many:consumers :through=> :resource_relationships
 6) Inside: Users
     nas_many: resource_relationships
     has_many:s3_files :through=> :resource_relationships
 7) Inside: business_listings
     nas_many: resource_relationships
     has_many:s3_files :through=> :resource_relationships

私の混乱は、この関係の多形部分にあります。

私は「消費者」モデルを持っていないので。それがこの方程式にどのように当てはまるのかわかりません。私はいくつかのチュートリアルをオンラインで見て、上記の方法と概念を思いついたが、これがこの問題に取り組む正しい方法であるかどうかは定かではない。

基本的に、ここで「コンシューマー」はすべてのモデルが「実装」するインターフェースのようなものであり、S3_fileモデルはこのインターフェースを「実装」した任意のモデルに関連付けることができることを理解しています。問題は、モデルをどこでどのように実行するかです。ユーザーとbusiness_listingsは、この「コンシューマー」インターフェースを「実装」します。どうすれば設定できますか?

4

1 に答える 1

1

Whenever you want to store attributes about the relationship between to models in a many-to-many relationship, generally the relationship is :has_many, :through.

I'd recommend beginning with this simpler approach and then considering polymorphism later, if you need to. For now, begin with just having a consumer_type attribute you can use if you need it.

consumer.rb:

class Consumer < ActiveRecord::Base
  has_many :resource_relationships
  has_many :s3_files, through: :resource_relationships
  validates_presence_of :consumer_type
end

resource_relationship.rb:

class ResourceRelationship < ActiveRecord::Base
  belongs_to :consumer
  belongs_to :s3_file
end

s3_file.rb

class S3File < ActiveRecord::Base
  has_many :resource_relationships
  has_many :consumers, through: :resource_relationships
  validates_presence_of :s3_fileType
  validates_presence_of :file_path
end

Notice that this simplifies as well the need to have attributes in the resource_relationships table -- those attributes are really attributes of the consumer and s3_file models anyway, so it may be best to just keep them there.

:has_many, :through I generally find to be more flexible and easier to modify as the relationships between your models changes.

于 2012-07-06T03:52:03.700 に答える