1

これらの 2 つのブログ投稿を見て、RoR の has_many 関係について少しわかりにくいと感じています。

これで: http://kconrails.com/2010/01/16/many-to-many-relationships-in-ruby-on-rails/の「has_many :through」セクションで、著者はjoin table Contributionsは次のようなものです:

class CreateContributions < ActiveRecord::Migration
  def self.up
    create_table :contributions do |t|
      t.references :artist
      t.references :song
      t.string :instrument
      t.timestamps
    end
...........

したがって、結合テーブルの移行は、 t.references :artistt.references :songを使用して 2 つのテーブルArtistSongを参照します。また、その曲の楽器アーティストの演奏などの属性にアクセスしたい場合は、結合テーブルContributionsを使用してアクセスできます。

2 番目の投稿: http://kconrails.com/2010/01/29/has_and_belongs_to_many-associations-in-ruby-on-rails/セクション: 「has_many :through」では、著者がCategorizationsという名前の「本格的なテーブル」を紹介します。移行は次のようになります。

class CreateCategorizations < ActiveRecord::Migration
  def self.up
    create_table :categorizations do |t|
      t.integer :category_id
      t.integer :item_id
      t.timestamps
    end
...........

したがって、本格的なテーブルの移行では、 t.integer :category_idt.integer :item_idによって 2 つのテーブル Category と Item が参照されます。また、タイムスタンプなど、このテーブルの 2 つの属性に関連するものに固有の属性にのみアクセスできます。上記のようにモデルに属性 ( t.string :instrumentなど)を追加できますか?

たとえば、ManufacturerProductのような多対多のリレーション モデルがある場合、 Priceを追跡したいのですが、本格的なテーブルに入れる必要がありますよね? しかし、属性を 1 つだけ追加したいが、 Original_From (製品がどこで生産されたかを示す) のように追跡しない場合、結合テーブルに入れるだけでよいのでしょうか?

このように一般化できますか: 属性の数が限られており、追跡することが重要でない場合は、結合テーブルを使用します。属性の数が多く、追跡したい場合は、本格的なテーブルを使用します。それが正しいか?

データにアクセスするときの違いは何ですか? 上記の例で価格または場所にアクセスしたい場合はどうですか?

本格的なテーブルと結合テーブルの違いについてはまだ明確ではありません。アイデアを教えてください。どうもありがとうございました!

4

1 に答える 1

0

これはおおむね正しいと思います。 has_and_belongs_to_many(HABTM) 多対多関係の両方のモデルで、(ID なし、タイムスタンプなし、各テーブルの主キーへの外部キーのみ) 間の単純な結合テーブルを想定しています。

リレーションシップ自体 (結合テーブル) が「有用」である場合 (特に独自のフィールドがあるため、クラスで参照したいもの)、それを独自のモデルとしてhas_many :through =>定義し、リレーションシップを定義するために使用します。両側にbelongs_to、新しいモデルで。これは「本格的な」オプションです。

ほとんどの場合、どちらのオプションでも同じメソッドが得られます (たとえばlocations、Price に関するpricesメソッドと Location に関するメソッドが得られます)。しかし、確かに HABTM オプションはより制限されています。

たとえば、このaccepts_nested_attributes_for方法は単純な HABTM では機能しないが、has_many :through.

このRails ガイドは、どちらをいつ使用するかを説明するのに非常に優れていると思います 。

(そして、今後の Rails 4.0 では、HABTM のサポートが大幅に改善され、1 対多および多対多の関係を処理するためのいくつかの新機能が追加されているようです :-)

于 2012-11-29T20:51:34.083 に答える