2010-11-19 27 views

cevap

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

ya da sütun adları belirsiz sorunları vurursanız SQL gösterimde

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

o güvenli? Yani p [: tarih] kullanıcı girdisinden geliyorsa, bir SQL enjeksiyonu neden olabilir mi? – MhdSyrwan

+7

'where()' nedeniyle güvenlidir. 'Where()' işlevini kullanarak girişi otomatik olarak iptal eder. –

+25

Simone'un yorumu tamamen doğru değil; '() işlevi, işlev çağrısında daha sonra listelenecek şekilde, değişkenler yerine soru işaretleriyle yukarıda gösterilen biçimde kullanıldığında girdiden otomatik olarak çıkar. Bu şekilde kullanmak güvenli DEĞİLDİR: 'Not.where (" date> # {p [: date]} ")' – bdx

58

herşeyi dönüştürebilir, yapabileceğiniz:

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

'a dönün. Bir sebepten dolayı, bir PostgreSQL sunucusunda Simone'un "nerede" yöntemini kullanarak bulunmayan bir sütunda bir hatayla karşılaşıyordum ama SQLite'de çalıştı. Yönteminiz her ikisinde de çalıştı. – plackemacher

+1

Arel için bazı belgeler: https://github.com/rails/arel –

İlgili konular