1. ホーム
  2. ruby-on-rails

HABTMジョインテーブルのマイグレーションを手動で作成する必要がありますか?

2023-08-13 10:39:27

質問

今、HATBMを正しく動作させるのに苦労しています。私は、記事とタグというビートスキャナリオを持っています。多対多の関係なので、ここでは HABTM を使用すべきと推測しています。 しかし、手動で結合テーブル(この場合、articles_tags)を作成すべきかどうかわかりません。

私のコードは現在以下のとおりです。

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags  
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles
end

移行を実行すると、3番目のテーブルが作成されません。 また、私の3番目のテーブルは、ドメインロジックを持たず、単なるブラインド割り当てであることを付け加えたいと思います。

Rails 2.2.2を使っています。

どのように解決するのですか?

テーブルの1つのマイグレーションで行うか、それらのマイグレーションが実行されている場合は、別のマイグレーションで行う必要があります。

create_table :articles_tags, :id => false do |t|
  t.references :article, :tag
end

add_index :articles_tags, [:article_id, :tag_id]

これでテーブルが作成され :id => false はこのテーブルにidフィールドを追加しないようRailsに指示しています。インデックスもあるので、この結合テーブルの検索を高速化することができます。

このためにモデル(ArticlesTag)を生成してやることもできます。

# article.rb
has_many :articles_tags
has_many :tags, :through => :articles_tags

# tag.rb
has_many :articles_tags
has_many :articles, :through => :articles_tags

# article_tag.rb
belongs_to :tag
belongs_to :article

から生成されたマイグレーションでテーブルを作成し、そのテーブルを script/generate model articles_tag の呼び出しで生成されたマイグレーションにテーブルを作成します。