2010-11-19 8 views

Respuesta

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

o también puede convertir todo en la notación SQL

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

es seguro? Quiero decir, si p [: date] proviene de la entrada del usuario, ¿puede causar una inyección SQL? – MhdSyrwan

+7

Es seguro debido a 'where()'. El uso de 'where()' escapa automáticamente de la entrada. –

+25

El comentario de Simone no es del todo cierto; 'where()' escapa automáticamente de la entrada cuando se usa en el formato que se muestra arriba con signos de interrogación en lugar de variables, y luego se listan en la llamada a la función. No es seguro para usarlo de esta manera: 'Note.where ("fecha> # {p [: fecha]}")' – bdx

58

Si usted choca con problemas en los nombres de columna son ambiguos, que puede hacer:

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

Por alguna razón, me estaba poniendo un error con una columna no ser descubierto usando el método de Simone "donde" en un servidor PostgreSQL pero funcionó en SQLite. Tu método funcionó en ambos. – plackemacher

+1

Aquí hay documentación para Arel: https://github.com/rails/arel –

Cuestiones relacionadas