ละเว้นฟิลด์บางฟิลด์เมื่อทำการสอบถามใน Rails และ ActiveRecord

ฉันรู้ว่าฉันสามารถระบุบางฟิลด์เพื่อสืบค้นฐานข้อมูลด้วย pluck

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

อย่างไรก็ตาม ฉันต้องการทราบว่ามีวิธีระบุฟิลด์บางฟิลด์ที่ฉันต้องการหลีกเลี่ยงการสืบค้นจาก db หรือไม่ ต่อต้านการถอนขนบางชนิดเหรอ?

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

person The Whiz of Oz    schedule 03.03.2015    source แหล่งที่มา
comment
Item.where('due_at ‹ ?', 2.days.from_now).map{|a| a.attributes.ยกเว้น!(อีเมล รหัส).values}   -  person user3118220    schedule 03.03.2015


คำตอบ (1)


Model#attribute_names ควรส่งคืนอาร์เรย์ของคอลัมน์/แอตทริบิวต์ คุณสามารถยกเว้นบางส่วนและส่งผ่านไปยังวิธี pluck หรือ select

บางสิ่งเช่นนี้:

posts = Post.where(published: true).select(Post.attribute_names - ['enormous_field'])
person Maxim    schedule 03.03.2015
comment
การถอนขนเร็วกว่าการเลือกมาก - guides.rubyonrails.org/active_record_querying.html#pluck - person Anthony; 03.03.2015
comment
ไม่จริงหรอก pluck ใช้ select ภายใต้ประทุน มันแค่ส่งคืนผลลัพธ์เป็น Array ในขณะที่ select เป็น Records - person tompave; 03.03.2015
comment
@tompave พวกนี้ไม่เห็นด้วย การถอนเงินเร็วกว่า 90%: gavinmiller.io/2013/getting- เพื่อทราบถอนและเลือก - person The Whiz of Oz; 03.03.2015
comment
การถอนจะเร็วขึ้นอย่างน้อย 3 เท่า แต่คุณจะได้รับอาร์เรย์ ไม่ใช่วัตถุบันทึกที่ใช้งานอยู่กลับมา - person John Naegle; 03.03.2015
comment
pluck เร็วกว่าเนื่องจากแยกคอลัมน์เฉพาะจาก DB จากนั้นหยุดและส่งกลับเป็นอาร์เรย์โดยตรง select ในทางกลับกัน จะดำเนินการค้นหา เดียวกัน ที่ใช้โดย pluck แต่จะส่งกลับ ActiveRecord::Relation ความสัมพันธ์นี้สามารถแปลงเป็นอาร์เรย์ของบันทึกแบบเต็มได้ ส่วนที่ช้าคือการแปลงเป็น ActiveRecord::Base - person tompave; 03.03.2015