27

あるモデルを別の複数のモデルに関連付ける方法を理解するのに苦労しています。

現在のように、私は持っています:

class ModelA < ActiveRecord::Base
  has_many :model_b
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

ただし... ModelB は、ModelA の 1 つのインスタンスだけでなく、場合によっては 3 つのインスタンスに属する必要があります。has_many :through があることは知っていますが、この場合にどのように機能するかはわかりません。ModelA のすべてのインスタンスには、ModelB のインスタンスが常に 3 つだけ含まれます。ただし、前に述べたように、ModelB は ModelA の複数のインスタンスに属することができます。

4

2 に答える 2

50

Rails の多対多の関係では を使用しませんbelongs_to。代わりに、いくつかのオプションのいずれかを使用します。最初はhas_and_belongs_to_many

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

そして、次のような移行で、データベースに追加の結合テーブルを追加する必要があります。

class AddCategoriesItems < ActiveRecord::Migration
  def self.up
    create_table :categories_items, :id => false do |t|
      t.integer :category_id
      t.integer :item_id
    end
  end

  def self.down
    drop_table :categories_items
  end
end

結合テーブルの名前は、他の 2 つのテーブルの名前を組み合わせたものであることがわかります。:id => falseこのテーブルには主キーが必要ないため、テーブルは上記のようにアルファベット順に記載する必要があり、そこに存在する必要があります。Railsの関連付けが解除されます。

has_many :through関係自体に関する情報を保存する必要があるかのように知られている、別のより複雑な方法もあります。両方の方法を実行する方法と、それぞれをいつ使用するかについて詳しく説明した記事全体を書きました。

Rails の基本的な多対多の関連付け

他にご不明な点がございましたら、お問い合わせください。

于 2010-12-09T04:30:21.857 に答える
33

これは@Jaime Bellmyerが使用したものです

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

これを使用することをお勧めします

# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :category_items
  has_many :items, :through => :category_items
end

# app/models/item.rb
class Item < ActiveRecord::Base
  has_many :category_items
  has_many :categories, :through => :category_items
end

# app/models/category_items.rb
class CategoryItems < ActiveRecord::Base
  belongs_to :category
  belongs_to :items
end

これを使用すると、結合モデルが作成され、カテゴリとアイテムの処理をより詳細に制御できます。しかし、@Jaimeが提案したものを使用すると、モデルではなく結合テーブルのみが作成され、制御されなくなります。

于 2010-12-09T07:46:34.923 に答える