Mengabaikan bidang tertentu saat membuat kueri di Rails dan ActiveRecord

Saya tahu bahwa saya dapat menentukan bidang tertentu untuk menanyakan database dengan pluck.

ids = Item.where('due_at < ?', 2.days.from_now).pluck(:id)

Namun saya ingin tahu, apakah ada cara untuk menentukan bidang tertentu yang ingin saya hindari menanyakan dari db. Semacam anti-pencabutan?

  posts = Post.where(published: true).do_not_lookup(:enormous_field)

person The Whiz of Oz    schedule 03.03.2015    source sumber
comment
Item.where('due_at ‹ ?', 2.days.from_now).map{|a| a.atribut.kecuali!(email, id).values}   -  person user3118220    schedule 03.03.2015


Jawaban (1)


Model#attribute_names harus mengembalikan array kolom/atribut. Anda dapat mengecualikan beberapa di antaranya dan meneruskan ke metode pluck atau select.

Sesuatu seperti ini:

posts = Post.where(published: true).select(Post.attribute_names - ['enormous_field'])
person Maxim    schedule 03.03.2015
comment
memetik jauh lebih cepat daripada memilih - guides.rubyonrails.org/active_record_querying.html#pluck - person Anthony; 03.03.2015
comment
Tidak juga, pluck menggunakan select di bawah tenda, itu hanya mengembalikan hasil sebagai Array, sedangkan select sebagai Catatan. - person tompave; 03.03.2015
comment
@tompave orang ini tidak setuju. pemetikan lebih dari 90% lebih cepat: gavinmiller.io/2013/getting- mengetahui-memetik-dan-memilih - person The Whiz of Oz; 03.03.2015
comment
Pemetikan setidaknya 3x lebih cepat, tetapi Anda mendapatkan kembali array, bukan objek rekaman aktif. - person John Naegle; 03.03.2015
comment
pluck lebih cepat karena mengekstrak kolom tertentu dari DB, lalu berhenti dan langsung mengembalikannya sebagai Array. select, sebaliknya, akan menjalankan kueri sama yang digunakan dengan memetik, tetapi akan mengembalikan ActiveRecord::Relation. Relasi ini kemudian dapat diubah menjadi array rekaman lengkap. Bagian yang lambat adalah konversi ke ActiveRecord::Base - person tompave; 03.03.2015