2 つのモデルがありrestaurant
、user
has_and_belongs_to_many 関係を実行したいと考えています。
私はすでにモデルファイルにアクセスし、has_and_belongs_to_many :restaurants
およびを追加しましたhas_and_belongs_to_many :users
この時点で、Rails 3 で次のようなことができるはずだと想定しています。
rails generate migration ....
しかし、私が試したことはすべて失敗するようです。これは本当に単純なことだと思いますが、私は Rails 初心者なので、まだ学習中です。
ベストアンサー1
主キーのないrestaurant_id
ANDのみの別の結合テーブルを追加する必要があります。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 オプションを指定します。