Risposte:
Note.
where(:user_id => current_user.id, :notetype => p[:note_type]).
where("date > ?", p[:date]).
order('date ASC, created_at ASC')
oppure puoi anche convertire tutto in notazione SQL
Note.
where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
order('date ASC, created_at ASC')
where()
. L'uso where()
sfugge automaticamente all'input.
where()
sfugge automaticamente all'input quando viene utilizzato nel formato mostrato sopra con punti interrogativi al posto delle variabili, con questi elencati successivamente nella chiamata di funzione. NON è sicuro usarlo in questo modo:Note.where("date > #{p[:date]}")
where("user_id = ?",current_user.id)
è più rischioso che where(user_id: current_user.id)
nei casi in cui si uniscono modelli che hanno entrambi un user_id
campo. Utilizzando i mezzi prime SQL notazione è necessario includere la tabella chiarimenti da soli, ad esempio: where("notes.user_id = ?",current_user.id)
.
Se riscontri problemi in cui i nomi delle colonne sono ambigui, puoi fare:
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())
Puoi provare a usare:
where(date: p[:date]..Float::INFINITY)
equivalente in sql
WHERE (`date` >= p[:date])
Il risultato è:
Note.where(user_id: current_user.id, notetype: p[:note_type], date: p[:date]..Float::INFINITY).order(:fecha, :created_at)
E anche io sono cambiato
order('date ASC, created_at ASC')
Per
order(:fecha, :created_at)
Rails 6.1 ha aggiunto una nuova "sintassi" per gli operatori di confronto in where
condizioni, ad esempio:
Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)
Quindi la tua query può essere riscritta come segue:
Note
.where(user_id: current_user.id, notetype: p[:note_type], 'date >', p[:date])
.order(date: :asc, created_at: :asc)
Ecco un link a PR dove puoi trovare altri esempi.