回答:
どこ:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
そして
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
レール4の場合:
rails generate migration CreateJoinTableStudentTeacher student teacher
レール3の場合:
rails generate migration students_teachers student_id:integer teacher_id:integer
レール<3
script/generate migration students_teachers student_id:integer teacher_id:integer
(テーブル名には両方の結合テーブルがアルファベット順にリストされていることに注意してください)
次に、レール3以下の場合のみ、idフィールドが作成されないように、生成されたマイグレーションを編集する必要があります。
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
代わりに試みていますrails generate migration CreateJoinTableStudentTeacher student teacher
、それは同じですか?S(学生)はT(それぞれ)の前に必要ですか?
has_and_belongs_to_many
表には、この形式と一致する必要があります。結合する2つのモデルhas_and_belongs_to_many
がすでにDBにあるapples
と想定しています:およびoranges
:
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables. Don't use the
# unique if you allow duplicates.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
:unique => true
インデックスでを使用する場合は、(rails3で)に渡す:uniq => true
必要がありhas_and_belongs_to_many
ます。
詳細:Railsドキュメント
更新済み2010-12-13 IDとタイムスタンプを削除するように更新しました...基本的MattDiPasquale
にnunopolonia
は正しいです。IDがあってはならず、タイムスタンプやレールが機能してはいけませんhas_and_belongs_to_many
。
script/generate migration
ます...
接続する2つのモデルの名前をアルファベット順にテーブルに付け、2つのモデルIDをテーブルに配置する必要があります。次に、各モデルを相互に接続して、モデルに関連付けを作成します。
次に例を示します。
# in migration
def self.up
create_table 'categories_products', :id => false do |t|
t.column :category_id, :integer
t.column :product_id, :integer
end
end
# models/product.rb
has_and_belongs_to_many :categories
# models/category.rb
has_and_belongs_to_many :products
しかし、これはあまり柔軟ではないので、has_many:throughの使用を検討する必要があります。
一番上の答えは、オレンジからリンゴを検索するために使用されるとは思えない複合インデックスを示しています。
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables.
# This enforces uniqueness and speeds up apple->oranges lookups.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
# This speeds up orange->apple lookups
add_index(:apples_oranges, :orange_id)
私はこれが 'The Doctor What'に基づいているという答えを見つけ、議論も確かに役に立ちました。
Rails 4では、簡単に使用できます
create_join_table:table1s、:table2s
それがすべてです。
注意:テーブル1、テーブル2は英数字で構成する必要があります。
私は好きです:
rails g migration CreateJoinedTable model1:references model2:references
。このようにして、次のような移行を取得します。
class CreateJoinedTable < ActiveRecord::Migration
def change
create_table :joined_tables do |t|
t.references :trip, index: true
t.references :category, index: true
end
add_foreign_key :joined_tables, :trips
add_foreign_key :joined_tables, :categories
end
end
これらの列を使用してルックアップを行うことが多いため、これらの列にインデックスを付けるのが好きです。
add_foreign_key
テーブルを作成したのと同じ移行に配置すると失敗します。