Câu trả lời:
Ở đâu:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
và
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
cho đường ray 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
cho đường ray 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
cho đường ray <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(lưu ý tên bảng liệt kê cả hai bảng tham gia theo thứ tự bảng chữ cái)
và sau đó chỉ dành cho đường ray 3 trở xuống, bạn cần chỉnh sửa di chuyển đã tạo để trường id không được tạo:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
thay vì rails generate migration CreateJoinTableStudentTeacher student teacher
như vậy? S (tudent) có cần trước T (mỗi người) không?
Một has_and_belongs_to_many
bảng phải phù hợp với định dạng này. Tôi giả sử hai mô hình được tham gia has_and_belongs_to_many
đã có trong DB: apples
và 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)
Nếu bạn sử dụng :unique => true
chỉ mục trên, thì bạn nên (trong rails3) chuyển :uniq => true
đến has_and_belongs_to_many
.
Thêm thông tin: Tài liệu Rails
CẬP NHẬT 2010-12-13 Tôi đã cập nhật nó để xóa id và dấu thời gian ... Về cơ bản MattDiPasquale
và nunopolonia
chính xác: Không được có id và không được có dấu thời gian hoặc đường ray sẽ không cho phép has_and_belongs_to_many
hoạt động.
script/generate migration
...
Bạn nên đặt tên cho bảng là tên của 2 mô hình bạn muốn kết nối theo thứ tự bảng chữ cái và đặt hai id của mô hình vào bảng. Sau đó kết nối từng mô hình với nhau tạo ra các liên kết trong mô hình.
Đây là một ví dụ:
# 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
Nhưng điều này không linh hoạt lắm và bạn nên nghĩ về việc sử dụng has_many: thông qua
Câu trả lời trên cùng cho thấy một chỉ số tổng hợp mà tôi không tin sẽ được sử dụng để tra cứu táo từ cam.
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)
Tôi đã tìm thấy câu trả lời này dựa trên 'The Doctor What' hữu ích và cuộc thảo luận chắc chắn cũng vậy.
Trong rails 4, bạn có thể sử dụng đơn giản
created_join_table: table1s ,: table2s
nó là tất cả
Chú ý: bạn phải tắt bảng1, bảng2 bằng chữ và số.
Tôi thích làm:
rails g migration CreateJoinedTable model1:references model2:references
. Bằng cách đó tôi có được một di chuyển trông như thế này:
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
Tôi thích có chỉ mục trên các cột này vì tôi thường thực hiện tra cứu bằng các cột này.
add_foreign_key
sẽ thất bại nếu được đặt trong cùng di chuyển với di chuyển đã tạo các bảng.