2017-10-24 5 views
1

Booking의 경우 aasmstatemachine을 사용하십시오. 여러 조건에서 레코드를 효율적으로 가져 오기

상태 머신

아래가 나는 booking.payment_authorized를 호출 할 수있는 상태에 따라 예약을 가져 그래서

state :payment_authorized 
state :payment_captured 
state :payment_failed 
state :some_more_states 

을 말한다. 그러나 찾고있는 것은 상태가 payment_authorized이고 payment_captured 인 모든 레코드를 원한다는 것입니다.

이 작업은 booking.payment_authorized + booking.payment_captured이지만이 작업은 2 회의 데이터베이스 호출입니다. 하나는 authorized_state이고 다른 하나는 captured_state입니다. 이 작업을 한 번에 더 효율적으로 수행하려면 어떻게해야합니까?

+0

'booking.payment_authorised'는 예약 상태를 확인하지 않고 'payment_authorized'로 변경하지 않으시겠습니까? 'booking.payment_authorized? ' – kiddorails

+0

예, 오타가 수정되었습니다. 변경 될 것입니다. 하지만 그 두 국가를 만족시키는 모든 레코드를 가져와야하는 시나리오가 있습니다 ... – Abhilash

답변

2

당신은 하나의 쿼리에서 모든 레코드를 얻을 수 Booking.payment_authorized.or(Booking.payment_captured)을 사용할 수 있습니다 감사합니다.

+0

물론 문제가 없습니다! –

2

@ 톰이 문제에 대한 좋은 해결책을 제시했습니다. 두 개의 관계를 논리적으로 결합하기 위해 ActiveRelationOR을 사용합니다. 이 솔루션은 5

레일에 고유합니다 당신은 또한을 통해 작업을 수행 할 수 있습니다

Booking.where(aasm_state: [:payment_authorized, :payment_captured]) 

aasm

기본적으로 상태를 포함 aasm_state 열을 사용합니다. IN 쿼리를 만듭니다.

+0

설명해 주셔서 감사합니다. 이 방법은 스코프를 사용하여 작동하고 연결하기 쉽습니다. – Abhilash

+1

@Abhilash : Rails 스코핑은 ActiveRelation의 결과가 연결될 수있는 관계이므로 'OR'로도 작동합니다. 약간의 이점은 SQL이'OR'을 통해'IN' (일종의 정렬과 이진 검색)을 쿼리하는 방법입니다 (모든 행을 대상으로합니다). – kiddorails

+0

OR와 함께 범위를 사용하지 마십시오. 정보를 가져 주셔서 감사합니다. – Abhilash