Như câu trả lời đầu tiên ghi nhận, trật tự là một Lệnh Active Record về cơ bản thực hiện truy vấn SQL trên cơ sở dữ liệu của bạn, nhưng trường đó không thực sự tồn tại trong cơ sở dữ liệu của bạn.
Khi ai đó nhận xét, bạn sạch hơn có thể chạy các phương pháp sort_by của Ruby bằng cách sử dụng dấu và (biết thêm here):
Post.all.sort_by(&:custom_method)
Tuy nhiên, mọi việc trở nên phức tạp tùy thuộc vào những gì bạn muốn làm theo quan điểm của bạn. Tôi sẽ chia sẻ một trường hợp gần đây tôi đã làm trong trường hợp đó giúp bạn suy nghĩ thông qua vấn đề của bạn. Tôi cần nhóm tài nguyên của mình bằng một tài nguyên khác gọi là "danh mục", sau đó sắp xếp tài nguyên gốc bằng "netvotes", đó là phương thức mô hình tùy chỉnh, sau đó sắp xếp theo tên. Tôi đã làm điều đó bằng cách:
- Thứ tự theo tên trong bộ điều khiển:
@resources = Resource.order(:name)
- Phân nhóm theo thể loại trong vòng ngoài của quan điểm:
<% @resources.group_by(&:category).each do |category, resources| %>
- Sau đó sắp xếp các nguồn lực bằng phiếu trong một phần cho nguồn:
<%= render resources.sort_by(&:netvotes).reverse %>
Quan điểm là một chút bối rối, vì vậy đây là vòng lặp cái nhìn đầy đủ trong index.html.erb:
<% @resources.group_by(&:category).each do |category, resources| %>
<div class="well">
<h3 class="brand-text"><%= category.name %></h3>
<%= render resources.sort_by(&:netvotes).reverse %>
</div>
<% end %>
Và đây là _resource.html.ERB phần:
<div class="row resource">
<div class="col-sm-2 text-center">
<div class="vote-box">
<%= link_to fa_icon('chevron-up lg'), upvote_resource_path(resource), method: :put %><br>
<%= resource.netvotes %><br>
<%= link_to fa_icon('chevron-down lg'), downvote_resource_path(resource), method: :put %>
</div>
</div>
<div class="col-sm-10">
<%= link_to resource.name, resource.link, target: "_blank" %>
<p><%= resource.notes %></p>
</div>
</div>
Hoặc đơn giản hơn bạn có thể sử dụng Post.all.sort_by (&: custom_method), đạt được kết quả tương tự nhưng hơi dễ dàng hơn trên mắt. – NZKoz
Điều này dường như không hoạt động nếu có nils trong trường so sánh của bạn. Có một cách giải quyết cho điều này? Tôi có các giá trị 'display_rank' theo sau [10, 20, 30, nil, nil, nil, nil, nil, nil] câu lệnh này' Event.find (607) .event_staff_users.sort_by {| u | u.display_rank} 'cho lỗi này' ArgumentError: so sánh NilClass với 30 thất bại'. Tôi thấy rằng sử dụng 'event_staff_users.sort_by {| u | u.display_rank hoặc 99999} 'làm việc và đặt nils cuối cùng. sử dụng hoặc 0 sẽ đặt chúng đầu tiên. – Dan