我有一個現有的模型在rails中,我想添加AASM狀態。如何添加默認的AASM狀態到現有的模型
從我的理解,我應該通過首先添加一個狀態列到我的數據庫,然後添加一些狀態到我的rails模型。如何根據另一列中的值設置默認狀態值?
我在正確的軌道上嗎?
我有一個現有的模型在rails中,我想添加AASM狀態。如何添加默認的AASM狀態到現有的模型
從我的理解,我應該通過首先添加一個狀態列到我的數據庫,然後添加一些狀態到我的rails模型。如何根據另一列中的值設置默認狀態值?
我在正確的軌道上嗎?
您正處於正確的軌道上。您可以在遷移中爲新記錄設置初始狀態。
請按如下所示使用: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
彼得的答案很好,但它有一個缺陷。如果更改默認狀態,則需要編寫新的遷移。所以,
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
這就是我一直在尋找!謝謝,彼得! – Masha
只是一個註釋 - 你是否錯過了你的遷移中的列類型? – Masha
哎呀,你是對的。你必須在這些結尾添加'::string',但我相信你已經做到了;)我會爲其他遇到它的人編輯答案。 –