2017-10-24 16 views
1

Bookingaasmstatemachineを使用する。複数の条件でレコードを効率的にフェッチする

ステートマシン下記持っだから、私はbooking.payment_authorizedを呼び出すことができる状態に基づいて、予約を取得するために

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

を述べています。しかし、探しているのは、状態がpayment_authorizedpayment_capturedのすべてのレコードが欲しいということです。

これはbooking.payment_authorized + booking.payment_capturedに動作しますが、これは2つのデータベース呼び出しを行っています。 1つはauthorized_state、もう1つはcaptured_stateです。これをより効率的に(1回の呼び出しで)行うにはどうすればよいですか?

あなたは

+0

は '「payment_authorized」にご予約のではなく、それをチェックするの状態を変更booking.payment_authorised'ないでしょうか? 'booking.payment_authorized? ' – kiddorails

+0

はい、入力ミスが修正されました。変更されます。しかし、私はそれらの2つの州を満たすすべてのレコードを取得する必要があるシナリオがあります... – Abhilash

答えて

2

あなたは、単一のクエリ内のすべてのレコードを取得するためにBooking.payment_authorized.or(Booking.payment_captured)を使用することができますありがとうございました。

+0

もちろん、問題ありません! –

2

@Tomは、問題のかなり良い解決策を与えました。これは、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

関連する問題