Đường ray 4.x
Khi bạn đã có users
và uploads
các bảng và muốn thêm một mối quan hệ mới giữa chúng.
Tất cả những gì bạn cần làm là: chỉ cần tạo một di chuyển bằng lệnh sau:
rails g migration AddUserToUploads user:references
Mà sẽ tạo một tệp di chuyển như:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Sau đó, chạy di chuyển bằng cách sử dụng rake db:migrate
. Việc di chuyển này sẽ đảm nhiệm việc thêm một cột mới được đặt tên user_id
vào uploads
bảng ( id
cột tham chiếu trong users
bảng), PLUS cũng sẽ thêm một chỉ mục trên cột mới.
CẬP NHẬT [Đối với Rails 4.2]
Rails không thể được tin cậy để duy trì tính toàn vẹn tham chiếu; cơ sở dữ liệu quan hệ đến để giải cứu của chúng tôi ở đây. Điều đó có nghĩa là chúng ta có thể thêm các ràng buộc khóa ngoài ở cấp cơ sở dữ liệu và đảm bảo rằng cơ sở dữ liệu sẽ từ chối mọi hoạt động vi phạm tính toàn vẹn tham chiếu đã đặt này. Như @infoget đã nhận xét, Rails 4.2 xuất xưởng với sự hỗ trợ riêng cho các khóa ngoại (tính toàn vẹn tham chiếu) . Không bắt buộc nhưng bạn có thể muốn thêm khóa ngoại (vì nó rất hữu ích) vào tham chiếu mà chúng tôi đã tạo ở trên.
Để thêm khóa ngoại vào tham chiếu hiện có , hãy tạo một di chuyển mới để thêm khóa ngoại:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Để tạo một tham chiếu hoàn toàn mới với khóa ngoại (trong Rails 4.2) , hãy tạo một di chuyển bằng lệnh sau:
rails g migration AddUserToUploads user:references
sẽ tạo một tệp di chuyển như:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Điều này sẽ thêm một khóa ngoại mới vào user_id
cột của uploads
bảng. Khóa tham chiếu id
cột trong users
bảng.
LƯU Ý: Điều này ngoài việc thêm một tham chiếu, do đó bạn vẫn cần tạo một tham chiếu trước sau đó là khóa ngoại ( bạn có thể chọn tạo khóa ngoại trong cùng một di chuyển hoặc một tệp di chuyển riêng ). Active Record chỉ hỗ trợ các khóa ngoại cột đơn và hiện tại mysql
, mysql2
và PostgreSQL
các bộ điều hợp được hỗ trợ. Đừng thử điều này với các bộ điều hợp khác như sqlite3
, v.v. Tham khảo Hướng dẫn của Rails: Khóa ngoài để bạn tham khảo.