2012-08-24 2 views
3

레일에 기존 모델이 있으며이 모델에 AASM 상태를 추가하려고합니다.기존 모델에 기본 AASM 상태를 추가하는 방법

내 이해에서 마이그레이션을 통해 내 데이터베이스에 상태 열을 추가 한 다음 일부 상태를 내 레일 모델에 추가해야합니다. 다른 열의 값에 따라 기본 상태 값을 어떻게 설정합니까?

나는 올바른 길을 가고 있습니까?

답변

4

올바른 길을 가고 있습니다. 마이그레이션 자체에서 새 레코드의 초기 상태를 설정할 수 있습니다.

다음과 같이 : default 옵션을 사용하십시오.

# Assuming your model is named Order 
class AddStateToOrders < ActiveRecord::Migration 
    add_column :orders, :state, :string, :default => 'new' 
end 

아니면 열이 추가 된 후 각 레코드의 상태를 설정하는 루비의 간단한 비트를 사용할 수 있습니다 모든 레코드가 동일한 시작 상태를이 경우에 가장 유용합니다. 레코드의 초기 상태가 무언가에 조건이있는 경우보다 유용합니다.

# 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 
+0

그게 내가 찾고있는 것입니다! 고마워, 피터! – Masha

+0

메모 - 마이그레이션에서 열 유형이 누락 되었습니까? – Masha

+0

당신은 절대적으로 옳습니다. 끝에', : string'을 추가해야합니다. 그러나 이미 끝났다고 확신합니다;) 다른 사람의 답을 편집 할 것입니다. –

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 
관련 문제