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

[解決済み] Railsのハッシュアンドベローズ・マイグレーション

2022-08-16 05:38:26

質問

2つのモデル restaurantuser で、has_and_belongs_to_manyのリレーションシップを行いたい。

すでにモデルファイルには has_and_belongs_to_many :restaurantshas_and_belongs_to_many :users

この時点でRails 3と同じようなことができるはずだと推測しています。

rails generate migration ....

を作成することができますが、私が試したすべてが失敗しているようです。私はこれが本当に単純な何かであると確信しています私はrailsに新しいので、私はまだ勉強しています。

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

を持つ別の結合テーブルを追加する必要があります。 restaurant_iduser_id (主キーなし)の場合 アルファベット順 .

まずマイグレーションを実行し、生成されたマイグレーションファイルを編集します。

Rails 3

rails g migration create_restaurants_users_table

Rails 4 :

rails g migration create_restaurants_users

Rails 5

rails g migration CreateJoinTableRestaurantUser restaurants users

からの ドキュメント :

が名前の一部である場合、ジョインテーブルを生成するジェネレータもあります。 が名前の一部である場合、結合テーブルを生成するジェネレータもあります。


マイグレーションファイル( :id => false に注意してください。それが主キーの作成を妨げているのです)。

Rails 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

Rails 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 はフォワードまたはロールバックのマイグレーションを自動的に検出し、アップ/ダウンは必要ありません。

Rails 5

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

注意: create_join_table のパラメータとして渡すことができるカスタムテーブル名のオプションとして、以下のようなものがあります。 table_name . から ドキュメント

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