2016-02-02 55 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