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

彼得的答案很好,但它有一个缺陷。如果您更改默认状态,则需要编写新的迁移。所以,

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 回答