3

Rails に既存のモデルがあり、それに AASM ステートを追加したいと考えています。

私の理解では、最初に移行を通じて状態列をデータベースに追加してから、いくつかの状態を Rails モデルに追加する必要があります。別の列の値に従ってデフォルトの状態値を設定するにはどうすればよいですか?

私はまったく正しい軌道に乗っていますか?

4

2 に答える 2

6

あなたは正しい軌道に乗っています。移行自体で新しいレコードの初期状態を設定できます。

次のように :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
于 2012-08-24T15:14:11.497 に答える
1

ピーターの答えは良いですが、欠点が 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
于 2016-01-21T04:33:07.553 に答える