restaurant_id
とuser_id
(主キーなし)のみの別の結合テーブルを追加する必要があります。アルファベット順です。
まず、移行を実行してから、生成された移行ファイルを編集します。
レール3
rails g migration create_restaurants_users_table
レール4:
rails g migration create_restaurants_users
レールから5
rails g migration CreateJoinTableRestaurantUser restaurants users
0:
JoinTable は、名前の一部である場合テーブルを結合生み出す発電機もあります:
あなたの移行ファイル(: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
注:table_name
呼ばcreate_join_tableにパラメータとして渡すことができるカスタム・テーブル名のオプションもあります。デフォルトではdocs
からは、結合テーブルの名前がアルファベット順に 、create_join_tableに提供 最初の二つの引数の和集合から来ています。テーブル名をカスタマイズするには、次のオプションを指定します。テーブル名 オプション:
出典
2011-07-03 05:56:17
Dex
ソリューションが私にとって完璧に機能してくれてこの方法を使用すると単純な間違いがありました。rake db:railsコマンドの後に移行して、テーブルを生成しませんでした。 rake db:ロールバックをしてからファイルを編集し、rake db:migrateを実行しなければならなかったが、今はすべて動作する。 – dbslone
@Dex - ちょうど好奇心の理由から、逆の列順序で定義された第2の複合インデックスを使用している理由を説明できますか?私は列の順序が重要ではないという印象を受けました。私はDBAではなく、自分の理解をさらに進めたいと思っています。ありがとう! – plainjimbo
@ジンバあなたはそれを必要としません、それは本当にあなたのクエリに依存します。インデックスは左から右に読み込まれるので、 'restaurant_id'で検索すると、最初のインデックスが最も速くなります。 'user_id'で検索している場合は、2番目の方法が役に立ちます。もしあなたが両方で検索しているのであれば、データベースが必要なだけのスマートなものになると思います。だから私は第二のものが実際に複合化される必要はないと思う。これはほんの一例に過ぎません。これはRailsの質問だったので、DBセクションに投稿するとより完全な答えが得られます。 – Dex