Como se ha señalado la primera respuesta, el orden es una El comando Active Record que básicamente hace una consulta SQL en su base de datos, pero ese campo realmente no existe en su base de datos.
Como alguien comentó, puede ejecutar de forma más limpia el método de Ruby sort_by utilizando el signo (+ info here):
Post.all.sort_by(&:custom_method)
Sin embargo, las cosas se ponen complicadas dependiendo de lo que quiere hacer en tu opinión. Compartiré un caso que hice recientemente en caso de que lo ayude a pensar en su problema. Necesitaba agrupar mi recurso por otro recurso llamado "categorías", y luego ordenar el recurso original por "netvotes", que era un método de modelo personalizado, luego ordenar por nombre. Lo hice por:
- de pedido por su nombre en el controlador:
@resources = Resource.order(:name)
- Agrupar por categoría en el bucle exterior de la vista:
<% @resources.group_by(&:category).each do |category, resources| %>
- Entonces la clasificación de los recursos por votos en el parcial para recursos:
<%= render resources.sort_by(&:netvotes).reverse %>
la vista es un poco confuso, por lo que aquí es la vista vuelta completa en 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 %>
Y aquí está el _resource.html.erb parcial:
<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>
O un poco más simple que puede utilizar Post.all.sort_by (&: custom_method), logra el mismo resultado pero un poco más fácil para los ojos. – NZKoz
Esto no parece funcionar si hay nils en su campo de comparación. ¿Hay una solución para esto? Tengo los siguientes valores 'display_rank' [10, 20, 30, nil, nil, nil, nil, nil, nil] esta declaración' Event.find (607) .event_staff_users.sort_by {| u | u.display_rank} 'da este error' ArgumentError: comparación de NilClass con 30 failed'. Encontré que usando 'event_staff_users.sort_by {| u | u.display_rank o 99999} 'funcionó y pone los nils al último. usar o 0 los pondría primero. – Dan