Dalam program rel saya saat ini ketika saya menggunakan sesuatu seperti
user = User.find(10)
Ketika tidak ada pengguna dengan ID = 10, saya akan memiliki pengecualian seperti:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Bisakah saya mendapatkan nihil alih-alih meningkatkan pengecualian jadi ketika saya melakukan sesuatu seperti:
unless user = Challenge.find(10)
puts "some error msg"
end
Saya hanya ingin mendapatkan nol jika tidak ada catatan dan saya tidak ingin menggunakan begin / rescue
Terima kasih
Jawaban:
Ya, lakukan saja:
Untuk Rails 4 dan 5:
sumber
.find_by_*
akan nihil dan.find
tidak.Something.find_by(id: x)
itu akan membuat pernyataan SQL dengan semua pasangan atribut / nilai dari hash sebagai bagian dari klausa WHERE. Sepertinya Rails bug bagi saya.find_by_...
pencari dinamis untuk setiap atribut yang dimiliki model:id
. Jadi,Challenge.find_by_id(10)
harus bekerja terlepas dari versi Rails.Challenge.find(10) rescue nil
Di Rails 4, pencari dinamis - seperti
find_by_id
yang digunakan dalam jawaban yang diterima - tidak digunakan lagi.Ke depannya, Anda harus menggunakan sintaks baru:
sumber
Challenge.find_by(id: 10)
apakah cara lain untuk menulis iniAnda dapat melakukan ini sedikit hackish, cukup gunakan Antarmuka Kueri ActiveRecord.
ini akan menghasilkan nol, bukannya memunculkan Exception
sumber
find_by_id
karena portabel dari Rails 3 ke 4. Di rel 4, inifind_by(:id => 10)
.Mengapa Anda tidak menangkap pengecualian saja? Kasus Anda terlihat persis seperti pengecualian yang dibuat untuk:
Jika Anda ingin memulihkan dari kesalahan di blok penyelamatan (misalnya dengan mengatur pengguna placeholder (pola nol)), Anda dapat melanjutkan dengan kode Anda di bawah blok ini. Jika tidak, Anda mungkin hanya memasukkan semua kode Anda untuk "kasus bahagia" di blok antara "mulai" dan "penyelamatan".
sumber
begin…end
blok, jika Anda sudah memiliki blok seperti metode pengontrol. Dalam hal ini, satu-satunya saluran tambahan yang Anda butuhkan adalahrescue
saluran tersebut. Jauh lebih elegan dan lebih mudah ditangani daripada memeriksanil
denganif
pernyataan.Anda bisa mencobanya
Challenge.exists?(10)
sumber
Bagi mereka yang berjuang dengan mongoid , ternyata keduanya
find
danfind_by
metode akan menimbulkan pengecualian - tidak peduli versi rel Anda!Ada opsi (yaitu raise_not_found_error ) yang bisa disetel ke false, tetapi ketika falsey membuat
find
metode tidak memunculkan eksepsi juga.Jadi solusi untuk pengguna mongoid adalah kode yang menjijikkan:
sumber
.where(email: params[:email]).first
pada saya.rescue
sintaks itu karena dapat menyembunyikan masalah seperti kesalahan ketiksesederhana:
sumber
if user...else
Anda dapat menggunakan find_by dengan atribut yang diperlukan (dalam kasus Anda id) ini akan mengembalikan nil daripada memberikan kesalahan jika id yang diberikan tidak ditemukan.
atau Anda bisa menggunakan format baru:
Anda juga dapat menggunakan where tetapi Anda harus tahu bahwa where mengembalikan relasi record aktif dengan nol atau lebih record yang perlu Anda gunakan terlebih dahulu untuk mengembalikan hanya satu record atau nil jika record nol kembali.
sumber