Ketika saya memiliki array id, suka
ids = [2,3,5]
dan saya tampil
Comment.find(ids)
semuanya bekerja dengan baik. Tetapi ketika ada id yang tidak ada, saya mendapatkan pengecualian. Ini terjadi secara umum ketika saya mendapatkan daftar ID yang cocok dengan beberapa filter dan daripada saya melakukan sesuatu seperti
current_user.comments.find(ids)
Kali ini saya mungkin memiliki ID komentar yang valid, yang bagaimanapun bukan milik Pengguna yang diberikan, jadi tidak ditemukan dan saya mendapatkan pengecualian.
Saya sudah mencoba find(:all, ids)
, tetapi mengembalikan semua catatan.
Satu-satunya cara saya bisa melakukannya sekarang adalah
current_user.comments.select { |c| ids.include?(c.id) }
Tetapi bagi saya itu sepertinya solusi yang sangat tidak efisien.
Apakah ada cara yang lebih baik untuk memilih ID di Array tanpa mendapatkan pengecualian pada catatan yang tidak ada?
sumber
Array
bukanActiveRecord::Relation
, yang membatasi apa yang dapat Anda lakukan dengannya sesudahnya.Comment.where(id: [2, 3, 5])
mengembalikan sebuahActiveRecord::Relation
.Pembaruan: Jawaban ini lebih relevan untuk Rails 4.x
Melakukan hal ini:
Sisi kuat dari pendekatan ini adalah bahwa ia mengembalikan
Relation
objek, di mana Anda dapat bergabung dengan lebih banyak.where
klausa,.limit
klausa, dll., Yang sangat membantu. Ini juga memungkinkan ID yang tidak ada tanpa membuang pengecualian.Sintaks Ruby yang lebih baru adalah:
sumber
where
sintaks saat membandingkan ke array. Saya pikir saya mungkin harus kode SQL denganIN
pernyataan, tetapi ini terlihat lebih bersih dan merupakan pengganti yang mudah untuk yang sudah usangscoped_by_id
.Jika Anda membutuhkan lebih banyak kontrol (mungkin Anda perlu menyebutkan nama tabel) Anda juga dapat melakukan hal berikut:
sumber
your_id_array
ketika Anda mendapatkan kembali benda-benda itu?ORDER BY
akan berfungsi dalam situasi saya karena pesanan tidak didasarkan pada atribut. Namun, ada cara untuk melakukannya melalui SQL (jadi cepat) dan seseorang bahkan telah membuat permata untuk itu. Lihat T&J ini: stackoverflow.com/questions/801824/…Sekarang .find dan .find_by_id sudah tidak digunakan lagi di rail 4. Jadi, kita bisa menggunakan di bawah ini:
Ini akan bekerja bahkan jika beberapa id tidak ada. Ini berfungsi di
Juga untuk mengecualikan ID
sumber
Untuk menghindari pengecualian yang membunuh aplikasi Anda, Anda harus menangkap pengecualian itu dan memperlakukannya seperti yang Anda inginkan, menentukan perilaku aplikasi Anda pada situasi di mana id tidak ditemukan.
Berikut info lebih lanjut tentang pengecualian di ruby.
sumber
Anda juga dapat menggunakannya dalam named_scope jika Anda ingin menempatkan kondisi lain di sana
misalnya termasuk beberapa model lain:
sumber