Menggunakan rails 3 style bagaimana saya menulis kebalikan dari:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Saya ingin menemukan di mana id TIDAK nol. Saya mencoba:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Tapi itu kembali:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Itu jelas bukan yang saya butuhkan, dan hampir seperti bug di ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
sumber
sumber
!nil
dievaluasitrue
dalam Ruby, dan ARel diterjemahkantrue
ke1
dalam query SQL. Jadi permintaan yang dihasilkan sebenarnya adalah apa yang Anda minta - ini bukan bug ARel.Jawaban:
Cara kanonik untuk melakukan ini dengan Rails 3:
ActiveRecord 4.0 dan di atasnya menambahkan
where.not
sehingga Anda dapat melakukan ini:Saat bekerja dengan cakupan antara tabel, saya lebih suka memanfaatkan
merge
sehingga saya dapat menggunakan cakupan yang ada dengan lebih mudah.Juga, karena
includes
tidak selalu memilih strategi bergabung, Anda harus menggunakan direferences
sini juga, jika tidak, Anda mungkin berakhir dengan SQL yang tidak valid.sumber
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
kondisi hanya membangun AST, itu tidak mengenai database sampai Anda menekan metode terminal sepertieach
atauto_a
. Membangun kueri bukan masalah kinerja; apa yang Anda minta dari database.Ini bukan bug di ARel, ini bug dalam logika Anda.
Yang Anda inginkan di sini adalah:
sumber
true
, yang merupakan boolean.:id => true
membuat Andaid = 1
dalam SQLese.field_name != 'NULL'
.id = 't'
:)Untuk Rails4:
Jadi, yang Anda inginkan adalah gabungan dari dalam, jadi Anda harus menggunakan predikat gabungan:
Tetapi, sebagai catatan, jika Anda menginginkan kondisi "NOT NULL" cukup gunakan predikat tidak:
Perhatikan bahwa sintaks ini melaporkan penghentian (ini berbicara tentang snipet string SQL, tapi saya kira kondisi hash diubah menjadi string di parser?), Jadi pastikan untuk menambahkan referensi ke akhir:
sumber
references
panggilan membantu saya!Tidak yakin ini membantu tetapi ini yang berhasil untuk saya di Rails 4
sumber
Dengan Rails 4 mudah:
Lihat juga: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
sumber