ราง 4.x
เมื่อคุณมีอยู่แล้ว users
และuploads
ตารางและต้องการที่จะเพิ่มความสัมพันธ์ใหม่ระหว่างพวกเขา
สิ่งที่คุณต้องทำคือเพียงแค่สร้างการย้ายข้อมูลโดยใช้คำสั่งต่อไปนี้:
rails g migration AddUserToUploads user:references
ซึ่งจะสร้างไฟล์การโยกย้ายเป็น:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
rake db:migrate
จากนั้นเรียกใช้การย้ายโดยใช้ การโยกย้ายนี้จะดูแลการเพิ่มคอลัมน์ใหม่ที่มีชื่อuser_id
ลงในuploads
ตาราง ( id
คอลัมน์อ้างอิงในusers
ตาราง) บวกมันจะเพิ่มดัชนีในคอลัมน์ใหม่
อัพเดท [สำหรับ Rails 4.2]
Rails ไม่สามารถเชื่อถือได้เพื่อรักษาความสมบูรณ์ของการอ้างอิง ฐานข้อมูลเชิงสัมพันธ์มาช่วยเราที่นี่ นั่นหมายความว่าเราสามารถเพิ่มข้อ จำกัด foreign key ในระดับฐานข้อมูลเองและตรวจสอบให้แน่ใจว่าฐานข้อมูลจะปฏิเสธการดำเนินการใด ๆ ที่ละเมิด Referential Integrity นี้ ในฐานะที่เป็น @infoget ความเห็นRails 4.2มาพร้อมกับการสนับสนุนพื้นเมืองสำหรับปุ่มต่างประเทศ (มี Referential Integrity) ไม่จำเป็น แต่คุณอาจต้องการเพิ่มรหัสต่างประเทศ (เนื่องจากมีประโยชน์มาก) ในการอ้างอิงที่เราสร้างขึ้นด้านบน
หากต้องการเพิ่ม foreign key ไปยังการอ้างอิงที่มีอยู่ให้สร้างการโยกย้ายใหม่เพื่อเพิ่ม foreign key:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
ในการสร้างการอ้างอิงใหม่ทั้งหมดด้วย foreign key (ใน Rails 4.2)ให้สร้างการย้ายโดยใช้คำสั่งต่อไปนี้:
rails g migration AddUserToUploads user:references
ซึ่งจะสร้างไฟล์การโยกย้ายเป็น:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
สิ่งนี้จะเพิ่ม foreign key ใหม่ไปยังuser_id
คอลัมน์ของuploads
ตาราง รหัสอ้างอิงid
คอลัมน์ในusers
ตาราง
หมายเหตุ:นี่คือนอกเหนือจากการเพิ่มการอ้างอิงดังนั้นคุณยังคงต้องสร้างการอ้างอิงก่อนจากนั้นก็เป็นกุญแจสำคัญต่างประเทศ ( คุณสามารถเลือกที่จะสร้างกุญแจต่างประเทศในการโยกย้ายเดียวกันหรือไฟล์การโยกย้ายแยกต่างหาก ) Active Record สนับสนุนเฉพาะคีย์ต่างประเทศคอลัมน์เดียวและในปัจจุบันเท่านั้นmysql
, mysql2
และPostgreSQL
อะแดปเตอร์ได้รับการสนับสนุน อย่าลองสิ่งนี้กับอะแดปเตอร์อื่น ๆ เช่นsqlite3
ฯลฯ อ้างอิงถึงคู่มือราง: กุญแจต่างประเทศสำหรับการอ้างอิงของคุณ