Rails has_and_belongs_to_many 移行 質問する

Rails has_and_belongs_to_many 移行 質問する

2 つのモデルがありrestaurantuserhas_and_belongs_to_many 関係を実行したいと考えています。

私はすでにモデルファイルにアクセスし、has_and_belongs_to_many :restaurantsおよびを追加しましたhas_and_belongs_to_many :users

この時点で、Rails 3 で次のようなことができるはずだと想定しています。

rails generate migration ....

しかし、私が試したことはすべて失敗するようです。これは本当に単純なことだと思いますが、私は Rails 初心者なので、まだ学習中です。

ベストアンサー1

主キーのないrestaurant_idANDのみの別の結合テーブルを追加する必要があります。user_idアルファベット順

まず移行を実行し、生成された移行ファイルを編集します。

レール3

rails g migration create_restaurants_users_table

レール4:

rails g migration create_restaurants_users

レール5

rails g migration CreateJoinTableRestaurantUser restaurants users

からドキュメント:

名前に JoinTable が含まれる場合に結合テーブルを生成するジェネレーターもあります。


移行ファイル ( に注意してください:id => false。これは主キーの作成を防ぐものです):

レール3

class CreateRestaurantsUsers < ActiveRecord::Migration
  def self.up
    create_table :restaurants_users, :id => false do |t|
        t.references :restaurant
        t.references :user
    end
    add_index :restaurants_users, [:restaurant_id, :user_id]
    add_index :restaurants_users, :user_id
  end

  def self.down
    drop_table :restaurants_users
  end
end

レール4

class CreateRestaurantsUsers < ActiveRecord::Migration
  def change
    create_table :restaurants_users, id: false do |t|
      t.belongs_to :restaurant
      t.belongs_to :user
    end
  end
end

t.belongs_to必要なインデックスを自動的に作成します。def changeフォワードまたはロールバックの移行を自動検出します。アップ/ダウンは必要ありません。

レール5

create_join_table :restaurants, :users do |t|
  t.index [:restaurant_id, :user_id]
end

注: create_join_tableにパラメータとして渡すことができるカスタムテーブル名のオプションもありますtable_nameドキュメント

デフォルトでは、結合テーブルの名前は、create_join_table に指定された最初の 2 つの引数をアルファベット順に結合したものになります。テーブルの名前をカスタマイズするには、:table_name オプションを指定します。

おすすめ記事