문제

aasm을 사용하여 전환 시 객체 상태를 데이터베이스에 유지하는 가장 좋은 방법은 무엇입니까?나는 이것이 자동으로 일어날 것이라고 생각했지만 그렇지 않은 것 같습니다.

(편집하다:객체를 수동으로 저장하면 상태 열이 업데이트됩니다.하지만 전환 시에는 저장이 수행되지 않습니다.)

이 플러그인에 대한 유용한 문서를 많이 찾을 수 없으므로 더 나은 문서가 포함된 대체 유한 상태 머신 구현에 대한 제안이 있다면 도움이 될 수도 있습니다.

도움이 되었습니까?

해결책

전화를 하면 쾅! 전환 이벤트 메서드 형식을 사용하면 상태가 유지됩니다.예를 들어 다음 이벤트가 포함된 개체가 있다고 가정해 보겠습니다.

class Book < ActiveRecord::Base
  # ... 

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

  # ...
end

부름 book.close 상태를 다음으로 설정합니다. closed, 이지만 자동으로 저장되지는 ​​않습니다.부름 book.close! 상태를 설정하고 *AR 객체를 자동으로 저장합니다.

다른 팁

콜린이 제안한 바와 같이, AASM은 당신을 위해 당신의 변화를 지속 할 것입니다. Markus가 말한 것은 보석의 최신 버전에 버그가 있다는 사실을 제외하고는 잘못된 것입니다.

lib/persistence/active_record_persistence.rb의 180 행에서 (보석을 실행하여 이것을 얻을 수 있음) 주석을 볼 수 있습니다.

상태 열에 상태를 작성하고 update_attribute (유효성 검사를 우회하는)를 사용하여 데이터베이스에 유지합니다.

그러나 코드에서는 실제로 저장을 대신 호출합니다!

unless self.save

저장 메소드가 기본적으로 유효성 검사를 우회하지 않기 때문에 기본 모델이 유효성 검사에 실패 할 때 버그가 발생합니다. 빠른 수정은 대신이 작업을 수행하는 것입니다.

unless self.save(false)

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

나는 전환 후 AAMS가 물체의 상태를 지속 할 것이라고 믿는다. AASM/LIB/Persistence/Active_Record_Persistence.rb의 180-189 행 참조

그것이 당신이 원하는 효과라면 전환을 저장해야한다고 생각합니다. ActivereCord (AAMS가 위에 앉아있는)는 설계별로 기록되지 않습니다.

당신은 저축을 할 수 있습니다 콜백 당신이 원한다면 (그리고 그것은 당신처럼 들립니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top