Bagaimana Anda melakukan kueri OR di Rails 3 ActiveRecord. Semua contoh yang saya temukan hanya memiliki DAN kueri.
Edit: ATAU metode tersedia sejak Rails 5. Lihat ActiveRecord :: QueryMethods
ruby-on-rails
ruby-on-rails-3
rails-activerecord
pho3nixf1re
sumber
sumber
Post.where(column: 'something').or(Post.where(other: 'else'))
Jawaban:
Gunakan ARel
SQL yang dihasilkan:
sumber
matches
akan menghasilkanLIKE
untuk sqlite (case sensitif pada pengaturan standar) danILIKE
pada postgres (membutuhkan operator case seperti sensitif).Jika Anda ingin menggunakan operator OR pada nilai satu kolom, Anda dapat meneruskan array ke
.where
dan ActiveRecord akan menggunakanIN(value,other_value)
:output:
Ini harus mencapai persamaan
OR
pada kolom tunggalsumber
dalam Rails 3, seharusnya
Ini juga termasuk sql mentah tapi saya rasa tidak ada cara di ActiveRecord untuk melakukan operasi ATAU. Pertanyaan Anda bukan pertanyaan noob.
sumber
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
Versi Rails / ActiveRecord yang diperbarui mungkin mendukung sintaksis ini secara asli. Itu akan terlihat mirip dengan:
Seperti yang tercantum dalam permintaan tarik ini https://github.com/rails/rails/pull/9052
Untuk saat ini, cukup bertahan dengan karya-karya berikut hebat:
Update: Menurut https://github.com/rails/rails/pull/16052 yang
or
fitur akan tersedia di Rails 5Pembaruan: Fitur telah digabungkan ke cabang Rails 5
sumber
or
sekarang tersedia Rails 5 tetapi tidak diimplementasikan dengan cara ini karena mengharapkan 1 argumen untuk disahkan. Ia mengharapkan objek Arel. Lihat jawaban yang diterimaor
metode dalam ActiveRecord bekerja jika Anda menggunakannya secara langsung, tetapi dapat mematahkan harapan Anda jika digunakan dalam lingkup yang kemudian dirantai.Rails baru-baru ini menambahkan ini ke ActiveRecord. Tampaknya akan dirilis di Rails 5. Sudah berkomitmen untuk menguasai:
https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89
sumber
Rails 5 hadir dengan sebuah
or
metode. (l tinta ke dokumentasi )Metode ini menerima suatu
ActiveRecord::Relation
objek. misalnya:sumber
Jika Anda ingin menggunakan array sebagai argumen, kode berikut berfungsi di Rails 4:
Informasi lebih lanjut: ATAU kueri dengan array sebagai argumen di Rails 4 .
sumber
Order.where(query.where_values.inject(:or))
untuk menggunakan arel sepenuhnya.The MetaWhere Plugin benar-benar menakjubkan.
Gabungkan OR's dan AND's dengan mudah, gabung dengan kondisi di asosiasi mana pun, dan bahkan tentukan OUTER JOIN!
sumber
Tambahkan saja ATAU dalam kondisi
sumber
Saya baru saja mengekstrak plugin ini dari pekerjaan klien yang memungkinkan Anda menggabungkan cakupan dengan
.or.
, mis.Post.published.or.authored_by(current_user)
. Squeel (implementasi MetaSearch yang lebih baru) juga bagus, tetapi tidak membiarkan Anda ATAU ruang lingkup, jadi logika kueri bisa menjadi sedikit berlebihan.sumber
Dengan rel + arel, cara yang lebih jelas:
Menghasilkan:
sumber
Anda bisa melakukannya seperti:
atau lebih elegan, pasang rails_or gem dan lakukan seperti:
sumber
Saya ingin menambahkan ini adalah solusi untuk mencari beberapa atribut dari ActiveRecord. Sejak
akan mencari A dan B.
sumber
sumber