2016-02-02 82 views
0

我有一個表「收據」它包含兩個布爾列:將數據移動到剛創建一個在導軌遷移

Table name: invoices 

id    :integer   not null, primary key 
... 
sent    :boolean   default(FALSE) 
payment_received :boolean   default(FALSE) 

這兩個列定義發票的狀態:

def status 
    if sent & payment_received 
    :paid 
    elsif sent | payment_received 
    :sent 
    else 
    :created 
    end 
end 

有一天,它希望刪除這些布爾列,並創建新的列,將通過Rails的幫助包含發票狀態enum

status :integer 

enum status: [ :created, :sent, :paid ] 

所以現在我需要做3兩件事:

  1. 添加新列「狀態」
  2. 現有發票計算狀態,更新狀態欄
  3. 刪除列「派」和「payment_received」。

我該怎麼做?我可以在本地環境中輕鬆完成此任務,但我無法理解如何在生產服務器上執行此操作。例如,如果我將創建一個遷移來更新我的表和一個計算狀態的rake任務,遷移過程將首先移除,而我的數據將從布爾列中移除,然後才能使用它們。

注意:如果以某種方式它很重要:我使用Postgres。

任何幫助表示讚賞!

回答

5

請嘗試以下遷移。

class UpdateInvoicesTable < ActiveRecord::Migration 
    def self.up 
    add_column :invoices,:status,:string 

    Invoice.find_in_batches(batch_size: 2000) do |invoices| 
     invoices.each do |invoice| 
     if invoice.sent & invoice.payment_received 
      invoice.status = 'paid' 
     elsif invoice.sent | invoice.payment_received 
      invoice.status = 'sent' 
     else 
      invoice.status = 'created' 
     end 
     invoice.save 
     end 
    end 

    remove_column :invoices,:sent 
    remove_column :invoices,:payment_received 
    end 
end 
+0

感謝您的幫助! –

+0

我從來不知道你可以做到這一點。很好 – Tim