【问题标题】:How to add a default AASM state to existing model如何将默认 AASM 状态添加到现有模型
【发布时间】:2012-08-24 14:43:22
【问题描述】:

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

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

我是否走在正确的轨道上?

【问题讨论】:

    标签: ruby-on-rails aasm acts-as-state-machine


    【解决方案1】:

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

    使用 :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,但我相信您已经这样做了;)我将为遇到它的其他人编辑答案。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2012-08-13
      • 2018-12-15
      相关资源
      最近更新 更多