2016-04-12 11 views
1

ich, dassRails Active 4: richtige Weg, eine mehr als

Object.where('key > ?', value) 

Werke kennen zu schreiben.

Aber wenn die Abfrage mit key Spalten mehrere mehrere Tabellen beteiligt sind, haben passiert, ist es könnte Pause als die Abfrage erzeugt:

SELECT "tablename".* FROM "tablename" WHERE "tablename"."user_id" = $1 AND (key > 0) [["user_id", 29]] 

Eine Lösung

Object.where('tablename.key > ?', value) 

wäre aber Gibt es nicht eine Möglichkeit, dies stattdessen zu schreiben? Meine App hat (erzwungene) seltsame Tabellennamen, ich möchte sie lieber nicht dort schreiben und sie werden dynamisch durch den aktiven Datensatz hinzugefügt.

Dank

Antwort

2

Ich würde persönlich immer noch versuchen, mit AR auf, dass man zu bleiben, und etwas zu tun mit einer Reihe und einer Hash-Abfrage:

Object.where(tablename: { key: value..Float::INFINITY}) # If value is a number 
Object.where(tablename: { key: value..DateTime::Infinity.new}) # If value is a DateTime 
+0

definiere ich nicht, dass es irgendwelche * größer ist als * Zustand sehen. –

+0

'key> 30' ist äquivalent zu' key ist zwischen 30 und unendlich', daher der obige Bereich. – born4new

+0

Gotcha! Habe das '..' nicht gesehen Danke –

1

Wenn Sie sich von einem Objekt (eine Tabelle) Abfrage der Tabellenname in der where-Klausel fallen kann.

Object.where('key > ?', value) 

Leider ist das der beste Weg, es zu tun.

4

Es ist ein bisschen ausführlicher, aber Sie können arel dies zu tun verwenden. Zum Beispiel

Object.where(Object.arel_table[:key].gt(123)) 

wird Objekte auswählen, wo key > 123.

Wenn ich dies tat, würde ich wahrscheinlich einige Hilfsmethoden, vielleicht etwas entlang der Linien von

class Foo < ActiveRecord::Base 
    def self.column(name) 
    Foo.arel_table[name] 
    end 
    #now you can do 
    def self.some_method 
    Foo.where(column(:key).gt(123)) 
    end 
end 
Verwandte Themen