Bagaimana Anda melakukan or
kueri di Rails 5 ActiveRecord? Juga, apakah mungkin untuk terhubung or
dengan where
kueri ActiveRecord?
ruby-on-rails
ruby
activerecord
ruby-on-rails-5
rails-activerecord
KM Rakibul Islam
sumber
sumber
Jawaban:
Kemampuan untuk merangkai
or
klausa bersama denganwhere
klausa dalamActiveRecord
kueri akan tersedia di Rails 5 . Lihat diskusi terkait dan permintaan tarik .Jadi, Anda akan dapat melakukan hal-hal berikut di Rails 5 :
Untuk mendapatkan
post
denganid
1 atau 2:Beberapa contoh lain:
(A && B) || C:
(A || B) && C:
sumber
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))
ini harus membuat (a || b) && (c || d)ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
Kami tidak perlu menunggu rel 5 untuk menggunakan
OR
kueri ini . Kami juga bisa menggunakannya denganrails 4.2.3
. Ada backport di sini .Terima kasih kepada Eric-Guo untuk permata di mana-atau , Sekarang kita dapat menambahkan
OR
fungsi ini>= rails 4.2.3
juga dengan menggunakan permata ini.sumber
(Sekadar tambahan jawaban KM Rakibul Islam.)
Dengan menggunakan cakupan, kodenya bisa menjadi lebih cantik (tergantung pada pandangan mata):
sumber
Saya perlu melakukan a
(A && B) || (C && D) || (E && F)
Tapi dalam kondisi Rails
5.1.4
saat ini, hal ini terlalu rumit untuk diselesaikan dengan Arel atau rantai. Tapi saya masih ingin menggunakan Rails untuk menghasilkan kueri sebanyak mungkin.Jadi saya membuat retasan kecil:
Dalam model saya, saya membuat metode pribadi yang disebut
sql_where
:Selanjutnya dalam ruang lingkup saya, saya membuat sebuah array untuk menampung OR
Yang akan menghasilkan hasil query yang diharapkan:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.Dan sekarang saya dapat dengan mudah menggabungkan ini dengan cakupan lain, dll. Tanpa OR yang salah.
Keindahannya adalah bahwa sql_where saya mengambil argumen klausa where-clause yang normal:
sql_where(name: 'John', role: 'admin')
akan menghasilkan(name = 'John' AND role = 'admin')
.sumber
.merge
sebagai padanan &&, dan membangun pohon yang tepat untuk menangkap orang tua Anda. Sesuatu seperti ...(scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF))
, dengan asumsi masing-masing cakupan terlihat sepertiModel.where(...)
Rails 5 memiliki kemampuan untuk
or
klausa denganwhere
. Sebagai contoh.sumber