2009-03-25 3 views
7

aasm을 사용하여 전환시 데이터베이스의 객체 상태를 유지하는 가장 좋은 방법은 무엇입니까? 나는 이것이 자동적으로 일어날 것이라고 생각했지만 이것은 그렇지 않은 것으로 보인다.rubyist-aasm (상태 머신으로 작동)을 사용하여 전환시 상태 컬럼 유지하기

(편집 : 내가 수동으로 객체를 저장할 때, 상태 열이 업데이트됩니다 않습니다하지만 저장이 전환에서 수행되지 않습니다.).

나는 그래서 만약,이 플러그인에 대한 많은 유용한 문서를 찾을 수 없습니다 더 나은 문서화를 제공하는 대안적인 유한 상태 기계 구현에 대한 제안이 있습니다. 이는 도움이 될 수도 있습니다.

답변

14

으로 전화하면! 전환 이벤트 메서드의 양식은 상태가 유지됩니다.

closed에 상태를 설정합니다 book.close를 호출
class Book < ActiveRecord::Base 
    # ... 

    aasm_event :close do 
    transitions :to => :closed, :from => [:opened] 
    end 

    # ... 
end 

하지만 자동으로 저장하지 않습니다 : 예를 들어, 다음과 같은 이벤트와 객체를 말한다. book.close!을 호출하면 * 상태가 설정되고 * 자동으로 AR 개체가 저장됩니다.

-3

당신이 원하는 효과가 있다면 전환을 저장해야한다고 생각합니다. ActiveRecord (aasm이 위에 놓여 있음)는 의도적으로 레코드를 자동 저장하지 않습니다.

원한다면 저장을 할 수 있습니다 (원하는 것처럼 들릴 수도 있음). callback.

+0

감사합니다. 그것이 내가 필요한 것입니다. 며칠 만에 '콜백'과 같은 멋진 단어를 생각할 수없는 것 같습니다.) – Angela

+2

이것은 필요하지 않습니다. 모든 이벤트 전환에는 bang 메서드가있어 레코드를 자동으로 유지합니다. 자세한 내용은 내 대답을 참조하십시오. –

0

전이 후 AASM이 객체의 상태를 유지한다고 생각합니다. aasm/lib/persistence/active_record_persistence.rb에서 180-189 행을 참조하십시오.

4

콜린 (Colin)이 제안한대로 AASM은 변경 사항을 유지합니다. Markus가 말한 바에 따르면, 보석의 최신 버전에는 버그가 있다는 사실을 제외하고는 올바르지 않습니다.

lib 디렉토리/지속성/active_record_persistence.rb 라인 (180)에

(당신이 보석 실행하여이를 얻을 수 있습니다 : 압축을) :

는 상태 열에 상태를 기록하고 계속, 당신은 내용의 주석을 참조한다 데이터베이스에 업데이트 (유효성 검사를 우회하는) update_attribute 사용

그러나 코드에서 실제로 save를 호출합니다!

unless self.save 

저장 방법이 기본적으로 유효성 검사를 무시하지 않기 때문에 기본 모델이 유효성 검사에 실패하면 버그가 발생합니다. 이 문제를 해결하려면 다음을 수행하는 것이 좋습니다.

unless self.save(false) 

이제 전환은 실제로 새 상태를 데이터베이스에 저장합니다.