ฉันจะเพิ่มค่าเริ่มต้นให้กับคอลัมน์ที่มีอยู่แล้วผ่านการโยกย้ายได้อย่างไร
เอกสารทั้งหมดที่ฉันสามารถหาได้แสดงให้คุณเห็นว่าต้องทำอย่างไรหากไม่มีคอลัมน์อยู่ แต่ในกรณีนี้
ฉันจะเพิ่มค่าเริ่มต้นให้กับคอลัมน์ที่มีอยู่แล้วผ่านการโยกย้ายได้อย่างไร
เอกสารทั้งหมดที่ฉันสามารถหาได้แสดงให้คุณเห็นว่าต้องทำอย่างไรหากไม่มีคอลัมน์อยู่ แต่ในกรณีนี้
คำตอบ:
นี่คือวิธีที่คุณควรทำ:
change_column :users, :admin, :boolean, :default => false
แต่ฐานข้อมูลบางอย่างเช่น PostgreSQL จะไม่อัปเดตฟิลด์สำหรับแถวที่สร้างไว้ก่อนหน้านี้ดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณอัปเดตฟิลด์ manaully ในการย้ายข้อมูลด้วย
change_column_default :employees, :foreign, false
from:
และto:
ถ้าคุณอยากให้มันเป็นแบบพลิกกลับได้ :)
สำหรับRails 4+ให้ใช้change_column_default
def change
change_column_default :table, :column, value
end
def change
`add_column: foos,: ชื่อ, ค่าเริ่มต้น:" บางอย่างสำหรับค่าที่มีอยู่ "` `change_column_default: foos,: ชื่อ, ค่าเริ่มต้น:" "end
change_column_default :products, :approved, from: true, to: false
- แต่ก็ใช้งานไม่ได้เช่นกัน
การใช้def change
หมายถึงคุณควรเขียนการย้ายข้อมูลที่สามารถย้อนกลับได้ และchange_column
ไม่สามารถย้อนกลับได้ คุณสามารถขึ้นไปได้ แต่ไม่สามารถลงได้เนื่องจากchange_column
ไม่สามารถย้อนกลับได้
แต่อาจเป็นสองบรรทัดพิเศษ แต่คุณควรใช้def up
และdef down
ดังนั้นหากคุณมีคอลัมน์ที่ไม่มีค่าเริ่มต้นคุณควรทำเช่นนี้เพื่อเพิ่มค่าเริ่มต้น
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
หรือถ้าคุณต้องการเปลี่ยนค่าเริ่มต้นสำหรับคอลัมน์ที่มีอยู่
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
ในฐานะของ Rails 4 คุณไม่สามารถสร้างการโยกย้ายเพื่อเพิ่มคอลัมน์ในตารางที่มีค่าเริ่มต้นได้ ขั้นตอนต่อไปนี้เพิ่มคอลัมน์ใหม่ไปยังตารางที่มีอยู่ซึ่งมีค่าเริ่มต้นเป็นจริงหรือเท็จ
$ rails generate migration add_columnname_to_tablename columnname:boolean
คำสั่งดังกล่าวจะเพิ่มคอลัมน์ใหม่ในตารางของคุณ
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
$ rake db:migrate
ดำเนินการ:
rails generate migration add_column_to_table column:boolean
มันจะสร้างการโยกย้ายนี้:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
ตั้งค่าเริ่มต้นการเพิ่ม: default => 1
add_column: ตาราง,: คอลัมน์,: boolean,: default => 1
วิ่ง:
rake db: โยกย้าย
Key is not present in table error
สำหรับการทำงานเพื่อหลีกเลี่ยงการ
นี่คือสิ่งที่คุณสามารถทำได้:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
แก้ไข: ... แต่เห็นได้ชัดว่านี่เป็นความผิดพลาดหน้าใหม่!
before_save
up
บล็อกแทนที่จะเป็นchange
บล็อก คุณสามารถปล่อยให้down
บล็อกว่างเปล่า มันจะไม่คืนค่าตารางกลับสู่สภาพเดิม แต่การโยกย้ายสามารถย้อนกลับได้