Rails migrations: เลิกทำการตั้งค่าเริ่มต้นสำหรับคอลัมน์


190

ฉันมีปัญหาว่าฉันมีการโยกย้ายใน Rails ที่ตั้งค่าการตั้งค่าเริ่มต้นสำหรับคอลัมน์เช่นตัวอย่างนี้:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

สมมติว่าฉันต้องการปล่อยการตั้งค่าเริ่มต้นในการโยกย้ายในภายหลังฉันจะทำเช่นนั้นได้อย่างไรโดยใช้การโยกย้ายราง

วิธีแก้ปัญหาปัจจุบันของฉันคือการเรียกใช้งานคำสั่ง sql แบบกำหนดเองในการย้ายข้อมูลรางแบบนี้:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

แต่ฉันไม่ชอบวิธีการนี้เพราะตอนนี้ฉันขึ้นอยู่กับว่าฐานข้อมูลต้นแบบตีความคำสั่งนี้อย่างไร ในกรณีที่มีการเปลี่ยนแปลงของฐานข้อมูลแบบสอบถามนี้อาจไม่ทำงานอีกต่อไปและการโยกย้ายจะถูกทำลาย ดังนั้นมีวิธีแสดงการยกเลิกการตั้งค่าเริ่มต้นสำหรับคอลัมน์ในรางหรือไม่?

คำตอบ:


387

Rails 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

ราง 3 และราง 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

7
ใน postgres นี้จะไม่จริงลดลงเริ่มต้นสำหรับคอลัมน์เพียงแค่ตั้งค่าให้CHARACTER VARYING NULL::character varying
อัตติลาโอ

8
ในเวอร์ชันล่าสุดคุณสามารถทำให้ย้อนกลับได้ ตัวอย่างเช่น: change_column_default(:table_name, :column_name, from: nil, to: false)
ทำเครื่องหมาย

1
@AttilaO ฉันประสบความสำเร็จในการดำเนินงานALTER TABLE table_name ALTER COLUMN type DROP DEFAULTไม่จำเป็นต้องตั้งค่าให้NULLฉันคิด
Eli Rose - ติดตั้ง MONICA ใหม่

FYI ดูเหมือนว่าเวอร์ชันที่สามารถย้อนกลับได้ซึ่ง @Mark กล่าวถึงถูกเพิ่มเข้าไปใน Rails 5+ ดังนั้นสิ่งใดก็ตามที่อยู่ด้านล่างคุณจะไม่สามารถใช้งานได้
Joshua Pinter

23

เสียงเหมือนคุณกำลังทำสิ่งที่ถูกกับ 'รัน' เป็นเอกสารชี้:

change_column_default(table_name, column_name, default)

ตั้งค่าเริ่มต้นใหม่สำหรับคอลัมน์ ถ้าคุณต้องการตั้งค่าเริ่มต้นเป็น NULL คุณไม่มีโชค คุณต้อง DatabaseStatements # ดำเนินการคำสั่ง SQL ที่เหมาะสมด้วยตัวคุณเอง ตัวอย่าง

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

ขอบคุณ! ฉันไม่พบคำแนะนำนี้ในเอกสารด้วยตัวเอง! Hopefull พวกเขาสร้างในการลดลงของค่าเริ่มต้นในการโยกย้ายในรุ่นอนาคตของราง
wulfovitch

1
นี่ไม่เป็นความจริงอีกต่อไปแล้วใน Rails 3.1.0, cfr apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…
asymmetric

14

ตัวอย่างต่อไปนี้ฉันใช้สร้างNULLคอลัมน์NOT NULLแต่ข้ามDEFAULTที่ระดับสคีมา:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

ฉันไม่เห็นคุณค่าที่เพิ่มขึ้นในคำตอบนี้เนื่องจากคำตอบที่ยอมรับนั้นเหมือนกัน
Mosselman

-3

ราง 4

change_column :courses, :name, :string, limit: 100, null: false

10
อันนี้เพิ่มข้อ จำกัด ไม่เป็นศูนย์ แต่ก็ไม่มีอะไรเกี่ยวข้องกับค่าเริ่มต้น
Extrapolator

ไม่มีอะไรเกี่ยวข้องกับ DEFAULT +1
Ivan Wang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.