0

Ich habe eine App, die ich brauche, um alle Anfragen zu sehen, die keine Anführungszeichen vom aktuellen Benutzer haben. Ich möchte Anfragen sehen, die keine Anführungszeichen und Anfragen mit Anführungszeichen anderer Benutzer enthalten.Rails Query, um alle Beiträge anzuzeigen, die keine Kommentare von current_user haben

Für keine Zitate Ich habe mit:

Request.includes(:quotes).where(quotes: { id: nil }).order(created_at: :desc) 

und für das Wo Nicht Abfrage war ich mit:

Requests.joins(:quotes).where.not(quotes: { service_center_id: current_service_center.id }) 

Das funktioniert mit einem Zitat. Wenn ich auf eine Anfrage zitiere, ist die Anfrage nicht länger in der Liste, aber sobald jemand anderes zitiert, kommt sie wieder in meine Liste. Es ist, als ob die Abfrage die anderen Zitate nicht von mir sieht, also wenn die Anfrage angezeigt wird, obwohl ich auch zitiert habe.

Hier ist ein Link zu einem Thoughtbot-Blog, wo mich das nicht inspiriert hat, in Models zu suchen. Nach unten macht er dieselbe Abfrage. Ich habe dem Autor eine E-Mail geschickt, aber noch nicht geantwortet. https://robots.thoughtbot.com/activerecords-wherenot

Hier sind meine Modelle:

Benutzer:

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

validates :first_name, presence: true 
alidates :last_name, presence: true 
validates :zipcode,  presence: true 


has_many :autos 
has_many :requests 
has_many :quotes, through: :requests 
has_many :appointments, through: :quotes 

Anfrage:

belongs_to :user 
belongs_to :auto 
has_many :quotes, dependent: :destroy 
has_many :appointments, through: :quotes 

validates :service, presence: true 

serialize :service 

validates_associated :quotes 

Zitat:

belongs_to :request 
belongs_to :service_center 

Service_center:

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

has_many :quotes 
has_many :requests, through: :quotes 

Antwort

0

Hier ist, wie Sie Ihre drei Ziele erreichen können.

Anfragen ohne Anführungszeichen:

Request.includes(:quotes).where(quotes: { id: nil }).order(created_at: :desc) 

Anfragen mit Zitaten von anderen Service-Centern:

Requests.joins(:quotes).where.not(quotes: { service_center_id: current_service_center.id }) 

Dies ist die Antwort auf Ihre Frage:

Anfragen ohne Zitate aus Ihrem Service mitte:

Request.where.not(
    id: Request.joins(:quotes) 
     .where(quotes: { service_center_id: current_service_center.id }) 
     .select(:id) 
) 

Das ist etwas jacky, aber es sollte funktionieren. Die Unterabfrage erhält alle Anfragen mit einem Angebot aus dem aktuellen Service Center. Die äußere Abfrage gibt alle Anforderungen zurück, die nicht in der ersten Liste enthalten sind. Es sollte immer noch schnell mit einer Abfrage in der Datenbank laufen.

andere Lösung, die das gleiche Ergebnis liefern wird, ist NOT EXISTS zu verwenden:

Request.joins(:quotes).where(
    Quote 
    .where('requests.id = quotes.request_id') 
    .where('quotes.service_center_id = ? ', current_service_center.id) 
    .exists.not 
) 

Dieses Ergebnis wird in einer Unterabfrage NOT EXISTS in SQL. Es sollte in etwa die gleiche Leistung wie die andere Abfrage ergeben. Ich nehme an, es ist nur eine Frage der Präferenz.

+0

Überprüfung! Danke für die schnelle Antwort und Neuformatierung meiner Frage. Wenn das current.service_center immer mehr Anführungszeichen erhält, wird dies zu einer starken Suche werden. oder vielleicht nur die IDs aus Anführungszeichen zu ziehen ist nicht so schlecht. Es ist nicht so, dass wir alle Daten ziehen. –

+0

Diese Abfrage ist selbst bei einer großen Anzahl von Anführungszeichen ziemlich performant, da sie die Angebots-IDs nicht an Rails sendet. Wenn Sie die 'sql' oder' .explain' betrachten, ist das eine ziemlich schnelle Abfrage. Die ganze Arbeit geschieht in der Datenbank. Dies entspricht dem Schreiben einer Abfrage mit einer Unteranfrage 'NOT EXISTS()' in der Klausel 'WHERE'. –

+0

Leider hat es nicht funktioniert, es gab die gleichen Ergebnisse wie die vorherige. Wenn die Anfrage mehrere Angebote enthält, schließt sie dies nicht aus den Ergebnissen aus. Wenn die Anfrage 115 aus 3 Anführungszeichen besteht und eine davon aus dem aktuellen _Service_center stammt, wird die Anfrage 115 tatsächlich noch angezeigt. –

Verwandte Themen