2017-01-13 3 views
0

Ich benutze Rails 5 und Postgres.Muss ich eine Art Index verwenden, um WHERE in Rails5 ActiveRecord zu verwenden?

Ich habe eine Tabelle ZipRanges mit den Spalten id, region_id, von, nach

Ich möchte alle Zeilen auswählen, in dem eine bestimmte Postleitzahl zwischen von und zu ist.

zip = 1234 
ZipRange.where("from < ?", zip).where("to > ?", zip) 

bekomme ich folgende Fehlermeldung:

ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR: syntax error at or near "from"

Muss ich eine Art von Index verwenden, um diese Abfrage zu machen?

Ich habe andere Abfragen ausprobiert und sie funktionieren gut. Zum Beispiel:

ZipRange.where("region_id = ?", 1) 

Antwort

1

From ist ein reserved word in Postgres (und ich würde auch andere Datenbanken erraten) und damit diese Fehlermeldung angezeigt. Aber der Hauptgrund ist, dass Sie Ihre Anfrage falsch einstellen.

Sie müssen Ihre Abfrage so formatieren.

ZipRange.where('zip >= :from AND zip <= :to', from: 1, to: 100) 

Sie können auch ein bisschen Phantasie und tun

ZipRange.where(zip: 1..100) 

Welche funktioniert auch mit Variablen

from = params[:from] 
to = params[:to] 
ZipRange.where(zip: from..to) 

EDIT: Im Lichte der Kommentar unten, hier ist eine weitere Version

ZipRange.where('from_column > :zip AND to < :zip', zip: 100) 

Ändern Sie from_column in Ihren neuen Spaltennamen.

+1

'ZipRange.where (zip: 1..100)' erstellt 'WHERE zip ZWISCHEN 1 UND 100 ', die leistungsfähiger sein kann. – max

+0

Der Hinweis mit den reservierten Wörtern war großartig. Ich habe gerade meine Spaltennamen geändert. Bitte beachten Sie, dass ich keine Spalte zip habe und die Zeile suchen möchte, in der zip zwischen zwei Werten liegt. Die Tabelle hat die Spalten von und bis und ich möchte die Zeile finieren, wo diese zwei Spalten größer und kleiner als eine gegebene Postleitzahl sind. – almo

+0

Ahh, ich habe mit einer Abfrage bearbeitet, um genau das zu tun. – Iceman

Verwandte Themen