답변:
어디:
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
표에서는이 형식과 일치해야합니다. 나는 두 가지 모델이 합류 할 수 있으리라 믿고있어 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 Docs
2010-12-13 업데이트] 나는 기본적으로 ... ID와 타임 스탬프를 제거하도록 업데이트되었습니다 MattDiPasquale
및 nunopolonia
올바른 :의 ID가 없어야합니다 거기에 타임 스탬프해서는 안이나 레일이 허용하지 않는 has_and_belongs_to_many
일에.
script/generate migration
...
연결하고자하는 두 모델의 이름을 알파벳 순서로 테이블에 지정하고 두 모델 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 사용에 대해 생각해야합니다.
상위 답변은 오렌지에서 사과를 찾는 데 사용되지 않을 것이라고 생각하는 복합 색인을 보여줍니다.
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
그게 다입니다.
주의 : 영숫자로 table1, table2를 입력해야합니다.
나는하는 것을 좋아한다 :
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
테이블을 생성 한 마이그레이션과 동일한 마이그레이션에 배치하면 실패합니다.