ราง 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ฯลฯ อ้างอิงถึงคู่มือราง: กุญแจต่างประเทศสำหรับการอ้างอิงของคุณ