ฉันต้องการสร้างคอลัมน์unique
ในสคริปต์การโยกย้าย Ruby on Rails วิธีที่ดีที่สุดที่จะทำคืออะไร? นอกจากนี้ยังมีวิธีการจัดทำดัชนีคอลัมน์ในตารางหรือไม่?
ผมอยากจะบังคับใช้คอลัมน์ในฐานข้อมูลเมื่อเทียบกับเพียงแค่ใช้unique
:validate_uniqueness_of
ฉันต้องการสร้างคอลัมน์unique
ในสคริปต์การโยกย้าย Ruby on Rails วิธีที่ดีที่สุดที่จะทำคืออะไร? นอกจากนี้ยังมีวิธีการจัดทำดัชนีคอลัมน์ในตารางหรือไม่?
ผมอยากจะบังคับใช้คอลัมน์ในฐานข้อมูลเมื่อเทียบกับเพียงแค่ใช้unique
:validate_uniqueness_of
คำตอบ:
คำตอบสั้น ๆ สำหรับ Rails รุ่นเก่า (ดูคำตอบอื่น ๆ สำหรับ Rails 4+):
add_index :table_name, :column_name, unique: true
ในการสร้างดัชนีหลายคอลัมน์ด้วยกันคุณจะต้องผ่านอาร์เรย์ชื่อคอลัมน์แทนที่จะเป็นชื่อคอลัมน์เดียว
add_index :table_name, [:column_name_a, :column_name_b], unique: true
หากคุณได้รับ "ชื่อดัชนี ... ยาวเกินไป" คุณสามารถเพิ่มname: "whatever"
วิธี add_index เพื่อทำให้ชื่อสั้นลง
สำหรับการควบคุมแบบละเอียดมีวิธี " execute
" ที่เรียกใช้ SQL แบบตรง
แค่นั้นแหละ!
หากคุณกำลังทำสิ่งนี้แทนการตรวจสอบความถูกต้องของรุ่นเก่าปกติตรวจสอบเพื่อดูว่ามันทำงานอย่างไร การรายงานข้อผิดพลาดไปยังผู้ใช้อาจไม่ดีเท่าที่ควรหากไม่มีการตรวจสอบระดับโมเดล คุณสามารถทำได้ทั้งสองอย่าง
indexed columns are not unique
ข้อผิดพลาดเมื่อพยายามสร้างดัชนีที่ไม่ซ้ำกันอาจเป็นเพราะข้อมูลในตารางมีข้อมูลที่ซ้ำกันอยู่แล้ว ลองลบข้อมูลที่ซ้ำกันและเรียกใช้การย้ายข้อมูลอีกครั้ง
, :name => "whatever"
กับadd_index
วิธีการที่จะทำให้ชื่อสั้น
รางสร้างการโยกย้าย add_index_to_table_name column_name: uniq
หรือ
รางสร้างการย้ายถิ่น add_column_name_to_table_name column_name: string: uniq: index
สร้าง
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
หากคุณกำลังเพิ่มดัชนีในคอลัมน์ที่มีอยู่ให้ลบหรือแสดงความคิดเห็นadd_column
บรรทัดหรือใส่ในการตรวจสอบ
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
add_column...
เนื่องจากยังไม่ได้กล่าวถึง แต่ตอบคำถามที่ฉันพบเมื่อพบหน้านี้คุณสามารถระบุว่าดัชนีควรจะไม่ซ้ำกันเมื่อทำการเพิ่มผ่านt.references
หรือt.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(ราว Rails อย่างน้อย4.2.7
)
หากคุณกำลังสร้างตารางใหม่คุณสามารถใช้ทางลัดแบบอินไลน์:
def change
create_table :posts do |t|
t.string :title, null: false, index: { unique: true }
t.timestamps
end
end
ฉันใช้ Rails 5 และคำตอบข้างต้นนั้นยอดเยี่ยม นี่เป็นอีกวิธีหนึ่งที่ใช้งานได้สำหรับฉัน (ชื่อตารางคือ:people
และชื่อคอลัมน์:email_address
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
คุณอาจต้องการเพิ่มชื่อสำหรับคีย์ที่ไม่ซ้ำกันหลายครั้งที่ชื่อ Unique_key เริ่มต้นโดยทางรถไฟอาจยาวเกินไปซึ่ง DB สามารถโยนข้อผิดพลาด
หากต้องการเพิ่มชื่อสำหรับดัชนีของคุณเพียงใช้name:
ตัวเลือก แบบสอบถามการโยกย้ายอาจมีลักษณะเช่นนี้ -
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
ข้อมูลเพิ่มเติม - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
add_index :table_name, :column_name, unique: true
ในการทำดัชนีหลายคอลัมน์ด้วยกันคุณจะต้องผ่านอาร์เรย์ชื่อคอลัมน์แทนชื่อคอลัมน์เดียว
หากคุณพลาดที่จะเพิ่มเฉพาะคอลัมน์ DB เพียงเพิ่มการตรวจสอบนี้ในรูปแบบเพื่อตรวจสอบว่าเขตข้อมูลไม่ซ้ำกัน:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
อ้างอิงที่นี่ ด้านบนมีวัตถุประสงค์เพื่อการทดสอบเท่านั้นโปรดเพิ่มดัชนีโดยการเปลี่ยนคอลัมน์ฐานข้อมูลตามที่ @Nate แนะนำ
โปรดอ้างอิงกับดัชนีนี้สำหรับข้อมูลเพิ่มเติม