Rails に既存のモデルがあり、それに AASM ステートを追加したいと考えています。
私の理解では、最初に移行を通じて状態列をデータベースに追加してから、いくつかの状態を Rails モデルに追加する必要があります。別の列の値に従ってデフォルトの状態値を設定するにはどうすればよいですか?
私はまったく正しい軌道に乗っていますか?
Rails に既存のモデルがあり、それに AASM ステートを追加したいと考えています。
私の理解では、最初に移行を通じて状態列をデータベースに追加してから、いくつかの状態を Rails モデルに追加する必要があります。別の列の値に従ってデフォルトの状態値を設定するにはどうすればよいですか?
私はまったく正しい軌道に乗っていますか?
あなたは正しい軌道に乗っています。移行自体で新しいレコードの初期状態を設定できます。
次のように :default オプションを使用します。これは、すべてのレコードの開始状態がまったく同じである場合に最も役立ちます。
# Assuming your model is named Order
class AddStateToOrders < ActiveRecord::Migration
add_column :orders, :state, :string, :default => 'new'
end
または、単純な ruby を使用して、列が追加された後に各レコードの状態を設定することもできます。レコードの初期状態が何かの条件付きである場合、より便利です。
# 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
ピーターの答えは良いですが、欠点が 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