Как отмечалось в первом ответе, order - это команда Active Record, которая, по сути, выполняет SQL-запрос к вашей базе данных, но это поле фактически не существует в вашей базе данных.
Как прокомментировал кто-то другой, вы можете более аккуратно запустить метод Ruby sort_by, используя амперсанд (подробнее здесь ):
Post.all.sort_by(&:custom_method)
Однако все усложняется в зависимости от того, что вы хотите сделать по вашему мнению. Я поделюсь делом, которое я недавно сделал, чтобы помочь вам обдумать вашу проблему. Мне нужно было сгруппировать свой ресурс по другому ресурсу, называемому «категориями», а затем отсортировать исходный ресурс по «netvotes», который представлял собой метод пользовательской модели, а затем упорядочить по имени. Я сделал это:
- Порядок по имени в контроллере:
@resources = Resource.order(:name)
- Группировка по категориям во внешнем цикле представления:
<% @resources.group_by(&:category).each do |category, resources| %>
- Затем сортировка ресурсов по голосам в частичном для ресурсов:
<%= render resources.sort_by(&:netvotes).reverse %>
Представление немного сбивает с толку, поэтому вот полный цикл просмотра в 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 %>
А вот часть _resource.html.erb:
<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>