2012-08-24 50 views
3

我有一個現有的模型在rails中,我想添加AASM狀態。如何添加默認的AASM狀態到現有的模型

從我的理解,我應該通過首先添加一個狀態列到我的數據庫,然後添加一些狀態到我的rails模型。如何根據另一列中的值設置默認狀態值?

我在正確的軌道上嗎?

回答

4

您正處於正確的軌道上。您可以在遷移中爲新記錄設置初始狀態。

請按如下所示使用:default選項。這是最有用的,如果每個記錄具有完全相同的起始狀態:

# Assuming your model is named Order 
class AddStateToOrders < ActiveRecord::Migration 
    add_column :orders, :state, :string, :default => 'new' 
end 

或者你可以使用紅寶石簡單的位來設置每個記錄的狀態加入後列。如果記錄的初始狀態是有條件的,則更有用。

# Still assuming your model is named Order 
class AddStateToOrders < ActiveRecord::Migration 
    add_column :orders, :state, :string 

    # Loop through all the orders, find out whether it was paid and set the state accordingly 
    Order.all.each do |order| 
    if order.paid_on.blank? 
     order.state = 'new' 
    else 
     order.state = 'paid' 
    end 
    order.save 
    end 
end 
+0

這就是我一直在尋找!謝謝,彼得! – Masha

+0

只是一個註釋 - 你是否錯過了你的遷移中的列類型? – Masha

+0

哎呀,你是對的。你必須在這些結尾添加'::string',但我相信你已經做到了;)我會爲其他遇到它的人編輯答案。 –

1

彼得的答案很好,但它有一個缺陷。如果更改默認狀態,則需要編寫新的遷移。所以,

class AddStateToOrders < ActiveRecord::Migration 
    def self.up 
    add_column :orders, :state, :string 
    Order.update_all(aasm_state: 'new') # it will apply just for existing records with empty state. 
    end 

    def self.down 
    remove_column :orders, :state 
    end 
end 
相關問題