ด้วย:limit
ในการสอบถามผมจะได้รับการบันทึก N แรก วิธีที่ง่ายที่สุดในการรับ N ระเบียนล่าสุดคืออะไร
ด้วย:limit
ในการสอบถามผมจะได้รับการบันทึก N แรก วิธีที่ง่ายที่สุดในการรับ N ระเบียนล่าสุดคืออะไร
คำตอบ:
แบบสอบถามบันทึกการใช้งานเช่นนี้ฉันคิดว่าคุณจะได้รับสิ่งที่คุณต้องการ ('Something' คือชื่อรุ่น):
Something.find(:all, :order => "id desc", :limit => 5).reverse
แก้ไข : ตามที่ระบุไว้ในความคิดเห็นอีกวิธีหนึ่ง:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
นี่คือ Rails 3 way
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
Array
วิธีการที่ถูกต้องคือSomeModel.limit(5).order('id desc')
ต่อ Arthur Neves ซึ่งส่งผลให้SELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
วิธีใหม่ในการทำราง 3.1 คือ SomeModel.limit(5).order('id desc')
last(5)
เพราะส่งคืนขอบเขตสำหรับการผูกมัดเพิ่มเติม
SomeModel.limit(100).reverse_order
กับ Rails 4 ( guide.rubyonrails.org/ ) เหมือนกัน
SomeModel.limit(5).order('id desc').pluck(:col)
จะทำสิ่งSELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
ที่มีประสิทธิภาพมากกว่าการคว้าคอลัมน์ทั้งหมดและละทิ้งทั้งหมดยกเว้นคอลัมน์เดียวSomeModel.last(5).map(&:col)
ซึ่งSELECT *
แทนที่จะเป็นSELECT col
(คุณไม่สามารถถอนได้หลังจากการโทร last; lazy-eval chain ลงท้ายด้วย last)
Something.last(5)
เพราะ:
Something.last(5).class
=> Array
ดังนั้น:
Something.last(50000).count
จะทำให้ความทรงจำของคุณระเบิดหรือใช้เวลาตลอดไป
Something.limit(5).order('id desc')
เพราะ:
Something.limit(5).order('id desc').class
=> Image::ActiveRecord_Relation
Something.limit(5).order('id desc').to_sql
=> "SELECT \"somethings\".* FROM \"somethings\" ORDER BY id desc LIMIT 5"
หลังเป็นขอบเขตที่ไม่ได้ประเมินค่า .to_a
คุณสามารถโซ่หรือแปลงเป็นอาร์เรย์ผ่าน ดังนั้น:
Something.limit(50000).order('id desc').count
... ใช้เวลาไม่กี่วินาที
สำหรับRails 4 และเวอร์ชั่นที่สูงกว่า:
คุณสามารถลองสิ่งนี้ถ้าคุณต้องการรายการแรกสุด
YourModel.order(id: :asc).limit(5).each do |d|
คุณสามารถลองสิ่งนี้ถ้าคุณต้องการรายการล่าสุด ..
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
เพราะเป็นเช่นเดียวกับYourModel.order()
โซลูชันอยู่ที่นี่:
SomeModel.last(5).reverse
ตั้งแต่รางเป็นคนขี้เกียจที่สุดก็จะตีฐานข้อมูลด้วย SQL ที่ชอบ: "SELECT table
* FROM. table
ORDER BY table
. id
DESC LIMIT 5"
SomeModel
SELECT
ตาราง.* FROM
table` ORDER table
BY id
DESC LIMIT 5` มันไม่ได้ทำการเลือกทั้งหมด
หากคุณต้องการตั้งค่าการเรียงลำดับผลลัพธ์ให้ใช้:
Model.order('name desc').limit(n) # n= number
หากคุณไม่ต้องการสั่งซื้อใด ๆ และเพียงต้องการบันทึกที่บันทึกไว้ในตารางจากนั้นใช้:
Model.last(n) # n= any number
ใน(rails 4.2)
โครงการรถไฟของฉันฉันใช้
Model.last(10) # get the last 10 record order by id
และมันใช้งานได้
เราสามารถใช้Model.last(5)
หรือModel.limit(5).order(id: :desc)
ในราง 5.2
เพียงแค่พยายามที่:
Model.order("field_for_sort desc").limit(5)
ฉันพบว่าแบบสอบถามนี้ดีกว่า / เร็วกว่าสำหรับการใช้วิธี "ถอน" ซึ่งฉันชอบ:
Challenge.limit(5).order('id desc')
สิ่งนี้จะให้ ActiveRecord เป็นผลลัพธ์ เพื่อให้คุณสามารถใช้. ดึงมันเช่นนี้:
Challenge.limit(5).order('id desc').pluck(:id)
ซึ่งให้รหัสเป็นอาร์เรย์ได้อย่างรวดเร็วในขณะที่ใช้รหัส SQL ที่ดีที่สุด
Challenge.limit(5).order('id desc').ids
จะใช้งานได้เช่นกัน :)
หากคุณมีขอบเขตเริ่มต้นในแบบจำลองของคุณที่ระบุลำดับจากน้อยไปหามากใน Rails 3 คุณจะต้องใช้การจัดลำดับใหม่แทนการสั่งซื้อตามที่ระบุไว้โดย Arthur Neves ด้านบน:
Something.limit(5).reorder('id desc')
หรือ
Something.reorder('id desc').limit(5)
สมมุติว่า N = 5 และโมเดลของคุณคือMessage
คุณสามารถทำสิ่งนี้:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
ดู sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
ที่สำคัญคือการเลือกย่อย ก่อนอื่นเราต้องกำหนดว่าอะไรคือข้อความสุดท้ายที่เราต้องการและจากนั้นเราต้องเรียงลำดับตามลำดับจากน้อยไปมาก
เพิ่มพารามิเตอร์คำสั่ง: ลงในแบบสอบถาม