2016-06-15 3 views
0

ich ein Modell wie diese: Order (id: integer, user_id: integer, target_id: integer, Inhalt: string, created_at: datetime, updated_at: datetime)Wie durch einzigartigen Datensatz erhalten Multi-Attribut

Es gehört dem Benutzer. Der Benutzer kann, um für sie wie machen:

  • Person A -> Person B
  • Person B -> Person A
  • Person A -> Person B

=> Der einzigartige Datensatz sollte A -> B sein, also wie kann ich Order zu eindeutiger Aufzeichnung filtern?

+1

Ich verstehe nicht, was Sie mit "A -> B" oder "B -> A" meinen, können Sie es anders erklären? – rmosolgo

+0

Vielen Dank für Ihre Antwort. Ich meine, Person A kann Ordnung zu Person B schaffen und umgekehrt. – Vanhensy

+1

Können Sie klarstellen, was Sie mit "Filter Order to Unique Record" meinen? Suchen Sie nach einer Abfrage, die beispielsweise alle Bestellungen von Benutzer A zurückgibt, bei denen das Ziel Benutzer B ist? – jmschles

Antwort

0

Okay, vorausgesetzt, Sie haben die Benutzer A und B, sollten Sie dies nur in der Lage sein zu tun:

Order.where(user: A, target: B) 

... vorausgesetzt, Sie Ihre Assoziationen definiert haben, sonst:

Order.where(user_id: A.id, target_id: B.id) 

EDIT: Habe gerade deinen Kommentar gesehen. Sie könnten .first zu einer der obigen Abfragen hinzufügen, nur um die erste Bestellung zu erhalten, wenn Sie das wollten.

EINE ANDERE BEARBEITUNG: Wie ich es verstehe, wenn es jemals eine oder mehrere Ordnungen zwischen A und B (oder B und A) gab, wollen Sie eine von ihnen ergreifen, und es ist Ihnen egal. Sie können dies tun:

(Order.where(user: A, target: B) + Order.where(user: B, target: A)).first 

, dass Sie einen Datensatz geben, wenn ein solches vorhanden ist und nil, wenn es nicht der Fall ist. Raw SQL wäre effizienter:

... aber weniger lesbar, und stellen Sie sicher, es zu testen. Viel Glück!

+0

Diese Abfrage gibt keinen eindeutigen Datensatz zurück. Ich habe verwendet: 'Order.uniq.pluck (: user_id,: target_id)' welche zurückgeben: '[[1,2], [1,14], [3,5], [1,23], [2,1 ], ...] 'Gibt es also eine Möglichkeit, die eindeutige Reihenfolge mit diesem Array abzufragen?! – Vanhensy

+0

Ich habe immer noch Probleme zu verstehen, was Sie mit "Unique Record" meinen. Es klingt wie du sagst, dass es mehrere Aufträge mit demselben Benutzer und Ziel geben könnte. Nehmen wir also an, dass Ihre obige Abfrage "[[1,2], [1,2]]" zurückgegeben hat. Wenn Sie nach dem einen oder dem anderen abfragen wollen, brauchen Sie ein Feld, das sie irgendwie unterscheidet. Ansonsten musst du nur etwas Willkürliches machen, wie zum Beispiel den ersten oder den letzten. – jmschles

+0

Hmmm ... Als dein neues Update. Also, was ist, wenn die Order (user_id: B, target_id: A)?! Es wird wieder einen neuen Rekord geben? – Vanhensy

Verwandte Themen