【发布时间】:2012-08-24 14:43:22
【问题描述】:
我在 Rails 中有一个现有模型,我想向其中添加 AASM 状态。
据我了解,我应该先通过迁移将状态列添加到我的数据库中,然后再将一些状态添加到我的 rails 模型中。如何根据另一列中的值设置默认状态值?
我是否走在正确的轨道上?
【问题讨论】:
标签: ruby-on-rails aasm acts-as-state-machine
我在 Rails 中有一个现有模型,我想向其中添加 AASM 状态。
据我了解,我应该先通过迁移将状态列添加到我的数据库中,然后再将一些状态添加到我的 rails 模型中。如何根据另一列中的值设置默认状态值?
我是否走在正确的轨道上?
【问题讨论】:
标签: ruby-on-rails aasm acts-as-state-machine
你在正确的轨道上。您可以在迁移本身中设置新记录的初始状态。
使用 :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
【讨论】:
, :string,但我相信您已经这样做了;)我将为遇到它的其他人编辑答案。
彼得的回答很好,但它有一个缺陷。如果更改默认状态,则需要编写新的迁移。所以,
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
【讨论】: