Ruby on rails 如何将默认AASM状态添加到现有模型

Ruby on rails 如何将默认AASM状态添加到现有模型,ruby-on-rails,aasm,acts-as-state-machine,Ruby On Rails,Aasm,Acts As State Machine,我在rails中有一个现有模型,我想向其中添加AASM状态 根据我的理解,我应该首先通过迁移将状态列添加到数据库中,然后将一些状态添加到rails模型中。如何根据另一列中的值设置默认状态值 我在正确的轨道上吗?你在正确的轨道上。您可以在迁移本身中设置新记录的初始状态 或者使用:default选项,如下所示。如果每条记录都具有完全相同的起始状态,则此选项最为有用: # Assuming your model is named Order class AddStateToOrders < Ac

我在rails中有一个现有模型,我想向其中添加AASM状态

根据我的理解,我应该首先通过迁移将状态列添加到数据库中,然后将一些状态添加到rails模型中。如何根据另一列中的值设置默认状态值


我在正确的轨道上吗?

你在正确的轨道上。您可以在迁移本身中设置新记录的初始状态

或者使用:default选项,如下所示。如果每条记录都具有完全相同的起始状态,则此选项最为有用:

# Assuming your model is named Order
class AddStateToOrders < ActiveRecord::Migration
  add_column :orders, :state, :string, :default => 'new'
end
#假设您的模型名为Order
类AddStateToOrders'new'
结束
或者,您可以使用简单的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
#仍然假设您的模型名为Order
类AddStateToOrders
彼得的答案是好的,但有一个缺陷。如果更改默认状态,则需要编写新的迁移。所以

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
class AddStateToOrders
这就是我要找的!谢谢你,彼得!请注意,迁移过程中是否缺少列类型?哦,你完全正确。您必须在它们的末尾添加
,:string
,但我相信您已经添加了;)我将为任何其他遇到它的人编辑答案。