การโยกย้าย Rails: self.up และ self.down เทียบกับการเปลี่ยนแปลง


86

ดูเหมือนว่ารางรุ่นใหม่จะมีวิธีการ "เปลี่ยน" เทียบกับ self.up และ self.down

จะเกิดอะไรขึ้นเมื่อต้องย้อนกลับการย้ายข้อมูลจะรู้ได้อย่างไรว่าต้องดำเนินการอย่างไร ฉันมีวิธีการต่อไปนี้ที่ต้องใช้ตามบทช่วยสอนออนไลน์:

class AddImageToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end

  def self.down
    remove_column :users, :image_file_name, :string
    remove_column :users, :image_content_type, :string
    remove_column :users, :image_file_size, :integer
    remove_column :users, :image_updated_at, :datetime
  end    
end

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


คำตอบ:


110

สำหรับรางการทำงานจำนวนมากสามารถเดาได้ว่าการดำเนินการผกผันคืออะไร (โดยไม่มีปัญหา) ตัวอย่างเช่นในกรณีของคุณการดำเนินการย้อนกลับของadd_columnการโทรเมื่อคุณย้อนกลับคืออะไร? remove_columnแน่นอนมัน ผกผันของcreate_tableคืออะไร? มันdrop_table. ดังนั้นในกรณีเหล่านี้ทางรถไฟการรู้วิธีย้อนกลับและกำหนดdownวิธีการนั้นไม่จำเป็น (คุณสามารถดูได้ในเอกสารวิธีการที่รองรับในปัจจุบันจากวิธีการเปลี่ยนแปลง )

แต่ให้ความสนใจเพราะสำหรับการดำเนินการบางอย่างคุณยังคงต้องกำหนดdownวิธีการเช่นหากคุณเปลี่ยนความแม่นยำของคอลัมน์ทศนิยมจะคาดเดาความแม่นยำเดิมในการย้อนกลับได้อย่างไร? เป็นไปไม่ได้ดังนั้นคุณต้องกำหนดdownวิธีการ

เช่นกล่าวว่าผมขอแนะนำให้คุณอ่านคู่มือ Rails Migrations


33

ดีกว่าที่จะใช้ขึ้นลงเปลี่ยน:

บน Rails 3 (ย้อนกลับได้):ซึ่งควรเพิ่มคอลัมน์ใหม่ไว้ด้านบนและเติมข้อมูลทั้งหมดในตารางขึ้นเท่านั้นและลบคอลัมน์นี้ลงเท่านั้น

def up
  add_column :users, :location, :string
  User.update_all(location: 'Minsk')
end

def down
  remove_column :users, :location
end

แต่:

คุณต้องหลีกเลี่ยงการใช้วิธีการเปลี่ยนแปลงที่ช่วยประหยัดเวลา ตัวอย่างเช่นหากคุณไม่จำเป็นต้องอัปเดตค่าคอลัมน์ทันทีหลังจากเพิ่มแล้วคุณจะลดรหัสนี้ลงเป็นดังนี้:

def change
  add_column :users, :location, :string
end

ด้านบนจะเพิ่มคอลัมน์ลงในตารางและลบออก รหัสน้อยกว่ามากและเป็นกำไร

ใน Rails 4:อีกวิธีหนึ่งที่มีประโยชน์ในการเขียนสิ่งที่เราต้องการในที่เดียว:

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end

คำอธิบายที่ดีครับ
Bibek Sharma

การย้อนกลับ? ยังเป็นวิธีที่ดีในการบอกทิศทางที่คุณกำลังดำเนินไปในการเปลี่ยนแปลงอีกด้วย
baash05

ไม่มีผลงานนี้ ActiveRecord::IrreversibleMigrationฉันเพียงแค่ให้ได้รับ
ทิ้งบัญชี

มีสถานการณ์ที่รางไม่สามารถย้อนกลับการโยกย้าย โปรดดูความช่วยเหลือ
Kaleem Ullah

1
class AddImageToUsers < ActiveRecord::Migration
  def change
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end
end

ขอบคุณ แต่จะเกิดอะไรขึ้นถ้าคุณย้อนกลับไป มันจะรู้ว่าต้องทำอย่างไร?
banditKing

3
ฉันง่วงนอน Aldo 'xoen' Giambelluca อธิบายทุกอย่าง
ไม่มีอะไรพิเศษ - ที่นี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.