Tôi muốn sắp xếp theo hai cột, một là DateTime ( updated_at
) và cột kia là Decimal (Giá)
Tôi muốn có thể sắp xếp trước tiên theo updated_at, sau đó, nếu nhiều mặt hàng xảy ra trong cùng một ngày, hãy sắp xếp theo Giá.
Tôi muốn sắp xếp theo hai cột, một là DateTime ( updated_at
) và cột kia là Decimal (Giá)
Tôi muốn có thể sắp xếp trước tiên theo updated_at, sau đó, nếu nhiều mặt hàng xảy ra trong cùng một ngày, hãy sắp xếp theo Giá.
Câu trả lời:
Giả sử bạn đang sử dụng MySQL,
Model.all(:order => 'DATE(updated_at), price')
Lưu ý sự khác biệt với các câu trả lời khác. Các updated_at
cột sẽ là một dấu thời gian đầy đủ, vì vậy nếu bạn muốn loại dựa trên ngày nó đã được cập nhật, bạn cần phải sử dụng một chức năng để có được chỉ là một phần ngày từ dấu thời gian. Trong MySQL, đó là DATE()
.
order
như vậy:Model.all(:order => "day asc, `order` asc")
Trong Rails 4, bạn có thể làm điều gì đó tương tự như:
Model.order(foo: :asc, bar: :desc)
foo
và bar
là các cột trong db.
Thing.find(:all, :order => "updated_at desc, price asc")
sẽ thực hiện thủ thuật.
Thing.all.order("updated_at DESC, price ASC")
là cách để đi Rails 3. (Cảm ơn @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.
Giao diện Truy vấn Bản ghi Hoạt động cho phép bạn chỉ định bao nhiêu thuộc tính bạn muốn để sắp xếp truy vấn của mình:
models = Model.order(:date, :hour, price: :desc)
hoặc nếu bạn muốn biết cụ thể hơn (cảm ơn @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Phần thưởng: Sau truy vấn đầu tiên, bạn có thể xâu chuỗi các truy vấn khác:
models = models.where('date >= :date', date: Time.current.to_date)
model
thành models
để mọi người biết nó đa dạng. Chỉ là một gợi ý.
:asc
thay vì asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
Trên thực tế có nhiều cách để làm điều đó bằng Active Record. Một cái chưa được đề cập ở trên sẽ là (ở nhiều định dạng khác nhau, tất cả đều hợp lệ):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Có lẽ nó dài dòng hơn, nhưng cá nhân tôi thấy nó dễ quản lý hơn. SQL chỉ được sản xuất trong một bước:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Do đó, đối với câu hỏi ban đầu:
Model.order(:updated_at).order(:price)
Bạn không cần phải khai báo kiểu dữ liệu, ActiveRecord thực hiện điều này một cách suôn sẻ và DB Engine của bạn cũng vậy
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
? Thứ tự của các mệnh đề thứ tự trong SQL trái ngược với những gì tôi nhận được khi chạy .to_sql
trên đó.
Không ai trong số này làm việc cho tôi! Sau đúng 2 ngày tìm kiếm trên mạng, tôi đã tìm ra giải pháp !!
giả sử bạn có nhiều cột trong bảng sản phẩm bao gồm: giá_phí_đặc_nghiệp và giá_mạch. Đây là hai cột mà chúng tôi đang cố gắng sắp xếp.
Được rồi, Đầu tiên trong Mô hình của bạn, hãy thêm dòng này:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
Thứ hai, trong Bộ điều khiển sản phẩm, hãy thêm nơi bạn cần thực hiện tìm kiếm:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(Lưu ý rằng:price
là một biểu tượng.)