2010-11-19 2 views

Antwort

203
Note. 
    where(:user_id => current_user.id, :notetype => p[:note_type]). 
    where("date > ?", p[:date]). 
    order('date ASC, created_at ASC') 

oder Sie können auch alles in die SQL-Notation

Note. 
    where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]). 
    order('date ASC, created_at ASC') 
+2

ist, dass sicher? Ich meine, wenn p [: Datum] von Benutzereingabe kam, kann es eine SQL-Injektion verursachen? – MhdSyrwan

+7

Es ist sicher wegen 'where()'. Mit 'where()' wird die Eingabe automatisch entfernt. –

+25

Simones Kommentar ist nicht ganz richtig; 'where()' entkommt automatisch der Eingabe, wenn es in dem oben gezeigten Format mit Fragezeichen anstelle von Variablen verwendet wird, wobei diese anschließend im Funktionsaufruf aufgelistet werden. Es ist NICHT sicher, es auf diese Weise zu verwenden: 'Note.where (" date> # {p [: date]} ")' – bdx

58

Wenn Sie Probleme treffen konvertieren, wo Spaltennamen nicht eindeutig sind, können Sie tun:

date_field = Note.arel_table[:date] 
Note.where(user_id: current_user.id, notetype: p[:note_type]). 
    where(date_field.gt(p[:date])). 
    order(date_field.asc(), Note.arel_table[:created_at].asc()) 
+2

Aus irgendeinem Grund bekam ich einen Fehler mit einer Spalte, die nicht mit Simones Where-Methode auf einem PostgreSQL-Server gefunden wurde, aber in SQLite. Ihre Methode hat bei beiden funktioniert. – plackemacher

+1

Hier ist eine Dokumentation für Arel: https://github.com/rails/arel –

Verwandte Themen