2016-10-06 1 views
0

Nun, ich habe den nächsten Rails-Bereich, wenn ein Wort gegeben Ich fand die Unternehmen, die dieses Wort entweder auf den Namen, die Beschreibung, die Stadt oder in irgendeiner der mit dem Unternehmen verbundenen Produkte.Finden Sie Koinzidenzen in verwandten Tabellen mit SQL und Rails und wissen Sie, wo die Koinzidenzen waren

includes([:products, {city: :department}]).where("unaccent(LOWER(companies.name)) 
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%') 
OR unaccent(LOWER(companies.description)) 
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%') 
OR unaccent(LOWER(cities.name)) 
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%') 
OR unaccent(LOWER(products.name)) 
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%')" 
.gsub("ñ","n")).references(:products, :city, :department) 

Das funktioniert ganz gut, aber ich weiß, in welchem ​​(Name, Beschreibung, Stadt oder Produkte) wissen müssen, war die gefunden Zufall.

Ich habe in den nächsten Lösungen gedacht, aber ich bin mir nicht sicher, ob es effizient oder gut genug ist.

Lösung. Trennen Sie den Bereich in 4 verschiedene Abfragen, und verwenden Sie dann eine Schleife und eine Aux-Spalte, um bei jeder Abfrage so etwas wie "Zufall findet in, Name und Beschreibung" einzufügen. dann diese so etwas wie verwenden

query1 | query2 | query3 | query4 # to merge the arrays 

Für die Aufzeichnung meine Rails-Anwendung ist Postgres 9.4

Antwort

1

mit Ich denke, Ihnen einen guten Start haben, indem Sie Ihre Ergebnisse in vier Abfragen zu trennen.

Wenn Sie sie zusammenführen, möchten Sie eine Möglichkeit erhalten, zu sehen, aus welcher Abfrage sie stammt.

Wenn Sie mit Ihren Ergebnissen ist Hashes fein sind, können Sie dies tun:

results = [] 
results.concat query1.map { |record| record.attributes.merge(query: "query1") } 
results.concat query2.map { |record| record.attributes.merge(query: "query2") } 
# etc 

Wenn Sie Ihre Ergebnisse wollen aktiven Datensatz Objekte sein, können Sie ein virtuelles Attribut hinzufügen und tun etwas ähnliches

+0

Danke, ein virtuelles Attribut ist, was ich brauchte, ich bin etwas besorgt über die Effizienz dieser Methode, weil es wie ein Doppelprozess ist, aber ich schätze, ich werde es versuchen. – Makarov

+0

Ich denke, SQL-Abfragen in einer Iteration zu tun ist eine schlechte Idee, aber Iteration durch etwas bereits im Speicher ist schneller –

Verwandte Themen