Saya baru mengenal rel. Apa yang saya lihat ada banyak cara untuk menemukan catatan:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
Dan sepertinya mereka semua menghasilkan SQL yang persis sama. Juga, saya percaya hal yang sama berlaku untuk menemukan banyak catatan:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
Apakah ada aturan praktis atau rekomendasi yang digunakan?
sumber
find_by
tidak ditinggalkan, tetapi sintaks berubah sedikit. Darifind_by_name("Bob")
kefind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
ia sudah usang, apakah Anda memiliki sumber? Tampaknyafind_by
danfind_by_...
keduanya masih didukung di Rails 4.di mana mengembalikan ActiveRecord :: Relation
Sekarang lihat implementasi find_by:
Seperti yang Anda lihat, find_by sama dengan di mana tetapi hanya mengembalikan satu catatan. Metode ini harus digunakan untuk mendapatkan 1 catatan dan di mana harus digunakan untuk mendapatkan semua catatan dengan beberapa syarat.
sumber
find_by
akan menyelamatkan::RangeError
dariwhere(*args)
dan mengembalikan nol.Model.find
1- Parameter: ID objek yang akan ditemukan.
2- Jika ditemukan: Ini mengembalikan objek (Satu objek saja).
3 - Jika tidak ditemukan: menimbulkan
ActiveRecord::RecordNotFound
pengecualian.Model.find_by
1- Parameter: kunci / nilai
Contoh:
2- Jika ditemukan: Ini mengembalikan objek.
3 - Jika tidak ditemukan: kembali
nil
.Catatan: Jika Anda ingin meningkatkan
ActiveRecord::RecordNotFound
penggunaanfind_by!
Model.where
1- Parameter: sama dengan
find_by
2- Jika ditemukan: Ini mengembalikan
ActiveRecord::Relation
berisi satu atau lebih catatan yang cocok dengan parameter.3 - Jika tidak ditemukan: Ini mengembalikan Kosong
ActiveRecord::Relation
.sumber
Ada perbedaan antara
find
danfind_by
yangfind
akan mengembalikan kesalahan jika tidak ditemukan, sedangkanfind_by
akan mengembalikan nol.Terkadang lebih mudah dibaca jika Anda memiliki metode seperti
find_by email: "haha"
, sebagai lawan.where(email: some_params).first
.sumber
Karena Rails 4 dapat Anda lakukan:
yang setara
find_by_name
dengan Rails 3.Gunakan
#where
saat#find
dan#find_by
tidak cukup.sumber
find_by
dan tidakfind_by_<column_name>
. Saya membutuhkannya untuk menjawab seseorang.find_by_name
dalam Rails 4? Sejauh yang saya tahu, itu tidak ditinggalkan .find_by(name: "Rob*")
Jawaban yang diterima umumnya mencakup semuanya, tetapi saya ingin menambahkan sesuatu, hanya jika Anda berencana untuk bekerja dengan model dengan cara seperti memperbarui, dan Anda sedang mengambil satu catatan (yang
id
Anda tidak tahu), Lalufind_by
apakah cara untuk pergi, karena itu mengambil catatan dan tidak memasukkannya ke dalam arraytetapi jika Anda menggunakan
where
maka Anda tidak dapat memperbaruinya secara langsungdalam kasus seperti itu Anda harus menentukannya seperti ini
sumber
Selain jawaban yang diterima, mengikuti juga valid
Model.find()
dapat menerima berbagai nomor id, dan akan mengembalikan semua catatan yang cocok.Model.find_by_id(123)
juga menerima array tetapi hanya akan memproses nilai id pertama yang ada dalam arraysumber
Kedua # 2 dalam daftar Anda sudah usang. Anda masih bisa menggunakannya
find(params[:id])
.Secara umum,
where()
bekerja di sebagian besar situasi.Inilah pos yang bagus: http://m.onkey.org/active-record-query-interface
sumber
Jawaban yang diberikan sejauh ini semuanya OK.
Namun, satu perbedaan yang menarik adalah
Model.find
pencarian berdasarkan id; jika ditemukan, ia mengembalikanModel
objek (hanya satu catatan) tetapi melempar yangActiveRecord::RecordNotFound
sebaliknya.Model.find_by
sangat mirip denganModel.find
dan memungkinkan Anda mencari kolom atau grup kolom apa pun di basis data Anda tetapi itu kembalinil
jika tidak ada catatan yang cocok dengan pencarian.Model.where
di sisi lain mengembalikanModel::ActiveRecord_Relation
objek yang sama seperti array yang berisi semua catatan yang cocok dengan pencarian . Jika tidak ada catatan yang ditemukan, itu mengembalikanModel::ActiveRecord_Relation
objek kosong .Saya harap ini akan membantu Anda dalam memutuskan mana yang akan digunakan kapan saja.
sumber
Misalkan saya punya model
User
User.find(id)
Mengembalikan baris di mana kunci utama = id. Jenis pengembalian akan menjadi
User
objek.User.find_by(email:"[email protected]")
Mengembalikan baris pertama dengan atribut yang cocok atau email dalam kasus ini. Jenis pengembalian akan menjadi
User
objek lagi.Catatan: -
User.find_by(email: "[email protected]")
mirip denganUser.find_by_email("[email protected]")
User.where(project_id:1)
Mengembalikan semua pengguna di tabel pengguna tempat atribut cocok.
Di sini tipe pengembalian akan menjadi
ActiveRecord::Relation
objek.ActiveRecord::Relation
kelas termasukEnumerable
modul Ruby sehingga Anda dapat menggunakan objeknya seperti array dan melewatinya.sumber
Bagian terbaik dari bekerja dengan teknologi open source adalah Anda dapat memeriksa panjang dan luasnya. Lihat tautan ini
find_by ~> Menemukan catatan pertama yang cocok dengan kondisi yang ditentukan. Tidak ada pemesanan tersirat jadi jika pesanan penting, Anda harus menentukannya sendiri. Jika tidak ada catatan yang ditemukan, mengembalikan nihil.
find ~> Menemukan catatan pertama yang cocok dengan kondisi yang ditentukan, tetapi jika tidak ada catatan yang ditemukan, itu menimbulkan pengecualian tetapi itu dilakukan dengan sengaja.
Lakukan checkout pada tautan di atas, ia memiliki semua penjelasan dan menggunakan case untuk dua fungsi berikut.
sumber
Saya pribadi akan merekomendasikan menggunakan
sumber