如何向现有模型添加默认AASM状态

3

我在rails中有一个现有的模型,想要添加AASM状态。

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

我是否正确地进行了操作?

2个回答

6

你正在正确的路上。你可以在迁移中设置新记录的初始状态。

可以使用以下方法之一来设置默认值。如果每个记录都具有完全相同的起始状态,则这是最有用的:

# 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

只是一个提醒 - 你的迁移中是否缺少了一列类型? - Masha
哎呀,你说得完全正确。你需要在这些末尾添加, :string,但我相信你已经做过了 ;) 我会编辑答案,以便其他人遇到同样问题时可以参考。 - Peter Duijnstee

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接