2017-10-24 4 views
1

Verwenden aasmstatemachine für Modell Booking.Effizientes Abrufen von Datensätzen unter mehreren Bedingungen

Die Zustandsmaschine haben unten erklärt

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

So Buchungen auf zustandsbasierten holen ich booking.payment_authorized nennen kann. Aber was ich suche, ist, dass ich alle Datensätze mit dem Status payment_authorized und payment_captured möchte.

Dies funktioniert booking.payment_authorized + booking.payment_captured, aber das macht 2 Datenbankaufrufe. eine zum Finden authorized_state und andere für captured_state. Wie kann ich das effizienter (in einem Anruf)?

Danke

+0

würde "booking.payment_authorised" den Buchungsstatus nicht auf "payment_authorized" ändern, anstatt es zu prüfen? Meinst du, 'booking.payment_authorized?' – kiddorails

+0

Ja, Tippfehler ist behoben .. Es wird sich ändern. Aber es gibt ein Szenario, in dem ich alle Datensätze abrufen muss, die diese zwei Zustände erfüllen ... – Abhilash

Antwort

2

Sie Booking.payment_authorized.or(Booking.payment_captured) können alle Datensätze in einer einzigen Abfrage zu erhalten.

+0

Sicher, kein Problem! –

2

@Tom gab eine ziemlich gute Lösung für das Problem. Es verwendet ActiveRelationOR für die logische Vereinigung von zwei Beziehungen. Beachten Sie, dass die Lösung spezifisch 5.

Rails können Sie auch tun es über:

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

aasm verwendet aasm_state Spalte den Zustand zu enthalten, standardmäßig aktiviert. Es wird die IN Abfrage machen.

+0

Vielen Dank für die Erklärung. Diese Methode funktioniert und ist einfach mit Bereichen zu ketten. – Abhilash

+1

@Abhilash: Rails Scoping wird auch mit OR funktionieren, da result von ActiveRelation eine Relation ist, die verkettet werden kann. Der leichte Vorteil besteht darin, wie SQL Abfragen "IN" (Sortieren und binäre Suche) über "ODER" (gilt für alle Zeile für Zeile). – kiddorails

+0

Niemals Scopes mit OR verwendet. Danke für die Info. – Abhilash

Verwandte Themen