ฉันต้องการจัดเรียงตามสองคอลัมน์หนึ่งคือ DateTime ( updated_at
) และอีกคอลัมน์เป็นทศนิยม (ราคา)
ฉันต้องการเรียงลำดับก่อนโดย updated_at จากนั้นหากมีหลายรายการเกิดขึ้นในวันเดียวกันให้จัดเรียงตามราคา
ฉันต้องการจัดเรียงตามสองคอลัมน์หนึ่งคือ DateTime ( updated_at
) และอีกคอลัมน์เป็นทศนิยม (ราคา)
ฉันต้องการเรียงลำดับก่อนโดย updated_at จากนั้นหากมีหลายรายการเกิดขึ้นในวันเดียวกันให้จัดเรียงตามราคา
คำตอบ:
สมมติว่าคุณใช้ MySQL
Model.all(:order => 'DATE(updated_at), price')
สังเกตความแตกต่างจากคำตอบอื่น ๆ updated_at
คอลัมน์จะมีการประทับเวลาเต็มรูปแบบดังนั้นหากคุณต้องการเรียงลำดับขึ้นอยู่กับวันที่มันได้รับการปรับปรุงคุณต้องใช้ฟังก์ชั่นที่จะได้รับเพียงส่วนหนึ่งวันจากการประทับเวลา ใน MySQL, DATE()
ที่อยู่
order
สิ่งนี้:Model.all(:order => "day asc, `order` asc")
ใน Rails 4 คุณสามารถทำสิ่งที่คล้ายกับ:
Model.order(foo: :asc, bar: :desc)
foo
และbar
เป็นคอลัมน์ในฐานข้อมูล
Thing.find(:all, :order => "updated_at desc, price asc")
จะทำเคล็ดลับ
Thing.all.order("updated_at DESC, price ASC")
คือทางรถไฟ 3 ทางที่จะไป (ขอบคุณ@cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
อัปเดตของคุณเป็นประโยชน์สำหรับฉันเมื่อฉันต้องการที่จะเป็นตัวพิมพ์เล็กค่าเรียง:
Active Record Query Interfaceช่วยให้คุณระบุแอตทริบิวต์ได้มากเท่าที่คุณต้องการสั่งซื้อ :
models = Model.order(:date, :hour, price: :desc)
หรือหากต้องการเจาะจงมากขึ้น (ขอบคุณ@ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
โบนัส: หลังจากการค้นหาครั้งแรกคุณสามารถเชื่อมโยงการค้นหาอื่น ๆ ได้:
models = models.where('date >= :date', date: Time.current.to_date)
model
เพื่อmodels
ให้คนรู้ว่ามันเป็นพหูพจน์ เพียงข้อเสนอแนะ
:asc
แทนasc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
จริงๆแล้วมีหลายวิธีที่จะทำได้โดยใช้ Active Record สิ่งที่ไม่ได้กล่าวถึงข้างต้นจะเป็น (ในรูปแบบต่างๆใช้ได้ทั้งหมด):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
อาจจะดูละเอียดกว่า แต่โดยส่วนตัวแล้วฉันคิดว่ามันง่ายต่อการจัดการ SQL สร้างขึ้นในขั้นตอนเดียวเท่านั้น:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
ดังนั้นสำหรับคำถามเดิม:
Model.order(:updated_at).order(:price)
คุณไม่จำเป็นต้องประกาศประเภทข้อมูล ActiveRecord ก็ทำได้อย่างราบรื่นและ DB Engine ของคุณก็เช่นกัน
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
หรือไม่ ลำดับของคำสั่งคำสั่งใน SQL เป็นตรงกันข้ามกับสิ่งที่ฉันได้รับเมื่อฉันเรียกใช้.to_sql
ว่า
Model.all(:order => 'updated_at, price')
สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน! หลังจากมองบนและล่างผ่านอินเทอร์เน็ตเพียง 2 วันก็พบวิธีแก้ปัญหา !!
สมมติว่าคุณมีคอลัมน์มากมายในตารางผลิตภัณฑ์ ได้แก่ special_price และ msrp นี่คือสองคอลัมน์ที่เราพยายามจัดเรียงด้วย
เอาล่ะอันดับแรกในโมเดลของคุณให้เพิ่มบรรทัดนี้:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
ประการที่สองใน Product Controller ให้เพิ่มตำแหน่งที่คุณต้องทำการค้นหา:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(โปรดทราบว่า:price
เป็นสัญลักษณ์)