Saya mencoba menemukan semua Pengguna dengan id lebih dari 200, tetapi saya mengalami beberapa masalah dengan sintaksis tertentu.
User.where(:id > 200)
dan
User.where("? > 200", :id)
keduanya gagal.
Ada saran?
ruby-on-rails
syntax
where
Adam Templeton
sumber
sumber
?
, daripada memasukkan200
?Saya hanya menguji ini di Rails 4 tetapi ada cara yang menarik untuk menggunakan rentang dengan
where
hash untuk mendapatkan perilaku ini.akan menghasilkan SQL
Hal yang sama dapat dilakukan dengan kurang dari dengan
-Float::INFINITY
.Saya baru saja memposting pertanyaan serupa bertanya tentang melakukan ini dengan tanggal di SO .
>=
vs.>
Untuk menghindari orang harus menggali dan mengikuti percakapan komentar di sini adalah yang utama.
Metode di atas hanya menghasilkan
>=
kueri dan bukan a>
. Ada banyak cara untuk menangani alternatif ini.Untuk angka diskrit
Anda dapat menggunakan
number_you_want + 1
strategi seperti di atas di mana saya tertarik dengan Penggunaid > 200
tetapi sebenarnya mencariid >= 201
. Ini bagus untuk bilangan bulat dan angka di mana Anda dapat menambah dengan satu unit bunga.Jika Anda memiliki nomor yang diekstraksi ke dalam konstanta yang dinamai dengan baik, ini mungkin yang paling mudah untuk dibaca dan dipahami sekilas.
Logika terbalik
Kita bisa menggunakan fakta itu
x > y == !(x <= y)
dan menggunakan rantai di mana tidak.yang menghasilkan SQL
Ini membutuhkan beberapa detik tambahan untuk membaca dan alasan tentang tetapi akan bekerja untuk nilai atau kolom non diskrit di mana Anda tidak dapat menggunakan
+ 1
strategi.Meja Arel
Jika Anda ingin menjadi mewah, Anda dapat menggunakan
Arel::Table
.akan menghasilkan SQL
Spesifikasinya adalah sebagai berikut:
Pendekatan ini akan memberi Anda SQL yang tepat yang Anda minati, tetapi tidak banyak orang yang menggunakan tabel Arel secara langsung dan dapat menemukannya berantakan dan / atau membingungkan. Anda dan tim Anda akan tahu apa yang terbaik untuk Anda.
Bonus
Mulai di Rails 5 Anda juga dapat melakukan ini dengan tanggal!
akan menghasilkan SQL
Bonus ganda
Setelah Ruby 2.6 dirilis (25 Desember 2018), Anda dapat menggunakan sintaks rentang tak terbatas baru! Alih-alih,
201..Float::INFINITY
Anda hanya bisa menulis201..
. Info lebih lanjut di posting blog ini .sumber
where
pencocokan dasar . Karena>
saya sarankan menggunakan>= (number_you_want + 1)
untuk kesederhanaan. Jika Anda benar-benar ingin memastikan itu hanya>
kueri, Anda dapat mengakses tabel ARel. Setiap kelas yang mewarisi dariActiveRecord
memilikiarel_table
metode pengambil yang mengembalikanArel::Table
untuk kelas itu. Kolom pada tabel diakses dengan[]
metode sepertiUser.arel_table[:id]
. Ini mengembalikanArel::Attributes::Attribute
Anda dapat memanggilgt
dan masuk200
. Ini kemudian dapat diteruskan kewhere
. misUser.where(User.arel_table[:id].gt(200))
.User.where(created_at: 3.days.ago..DateTime::Infinity.new)
.WHERE (users.created_at >= '2016-04-09 14:31:15' AND users.created_at < #<Date::Infinity:0x00>)
(kutu belakang di sekitar nama tabel dan kolom dihilangkan untuk pemformatan komentar SO).Penggunaan yang lebih baik adalah membuat ruang lingkup dalam model pengguna
where(arel_table[:id].gt(id))
sumber
Jika Anda ingin tulisan yang lebih intuitif, ada permata yang disebut squeel yang memungkinkan Anda menulis instruksi seperti ini:
Perhatikan karakter 'penjepit' {} dan
id
hanya berupa teks.Yang harus Anda lakukan adalah menambahkan squeel ke Gemfile Anda:
Ini mungkin memudahkan hidup Anda saat menulis pernyataan SQL yang kompleks di Ruby.
sumber
Arel adalah temanmu.
sumber
Kemungkinan mewah lainnya adalah ...
Fitur ini memungkinkan Anda untuk membuat kueri yang lebih komprehensif jika Anda ingin mengganti di banyak tempat, misalnya ...
Ini memiliki arti lebih daripada memiliki banyak
?
pada permintaan ...sumber
Saya sering mengalami masalah ini dengan bidang tanggal (di mana operator pembanding sangat umum).
Untuk menjelaskan lebih lanjut tentang jawaban Mihai, yang saya percaya merupakan pendekatan yang solid.
Untuk model, Anda dapat menambahkan cakupan seperti ini:
... dan kemudian di controller Anda, atau di mana pun Anda menggunakan model Anda:
... contoh yang lebih kompleks dengan gabungan terlihat seperti ini:
Keuntungan yang sangat besar dari pendekatan ini adalah (a) memungkinkan Anda menyusun pertanyaan Anda dari lingkup yang berbeda dan (b) menghindari collision alias ketika Anda bergabung ke tabel yang sama dua kali karena arel_table akan menangani bagian dari generasi permintaan tersebut.
sumber
Rails 6.1+
Rails 6.1 menambahkan 'sintaks' baru untuk operator perbandingan dalam
where
kondisi, misalnya:Jadi permintaan Anda dapat ditulis ulang sebagai berikut:
Berikut ini tautan ke PR tempat Anda dapat menemukan lebih banyak contoh.
sumber
Singkat:
sumber
where("id > ?", 200)
sintaks). Ini tidak mencapai itu.