Как использовать sort_by или order_by в представлении и контроллере с помощью will_paginate?

#ruby-on-rails #sorting #pagination

#ruby-on-rails #сортировка #разбивка на страницы

Вопрос:

В моем приложении rails я ограничиваю количество комнат, отображаемых на странице, с помощью разбивки на страницы, я хочу разрешить пользователю упорядочивать / сортировать результаты по разным столбцам модели комнаты. Я думаю, мне понадобится выпадающее меню, чтобы сделать это, а затем передать эти данные моему rooms_controller, возможно, через переменную экземпляра.

Как я могу отсортировать комнаты с помощью тега select в соответствии со столбцом и что мне нужно сделать в соответствующем контроллере, чтобы это сработало?

На данный момент я использую это для выпадающего меню:

index.html.erb

 ...
...
<%= will_paginate @rooms %>

<div id="order-by">
     <select>
        <option value="asc">Distance</option>
        <option value="asc">Name</option>
        <option value="asc">Price (low to high)</option>
        <option value="des">Price (high to low)</option>
        <option value="asc">Reviews</option>
      </select>
</div>
  

rooms_controller.rb

 ...
...
  def index
    @rooms = Room.paginate :page => params[:page], :per_page => 12
  end
...
  

Моя модель комнаты имеет listing_name: строка, адрес: строка, nightly_price: целое число и имеет множество отзывов. Моя обзорная модель принадлежит комнате. Я использую geocoder gem для определения местоположения комнаты.

Я искал allot и перепробовал несколько способов заставить это работать, и я не могу разобраться с этим. Я был бы очень рад любым подсказкам о том, как это решить! Если вам нужна дополнительная информация, просто дайте мне знать.

Комментарии:

1. Вы хотите упорядочить элементы только на странице или все записи в Room? Если вы хотите упорядочить все записи, вы можете либо обновить страницу, либо загрузить значения с помощью ajax.

Ответ №1:

Что-то вроде:

index.html.erb

 <%= will_paginate @rooms %>

<div id="order-by">
  <form>
    <select name="sort">
      <option value="distance">Distance</option>
      <option value="name">Name</option>
      <option value="price">Price (low to high)</option>
      <option value="price desc">Price (high to low)</option>
      <option value="review">Reviews</option>
    </select>

    <input type="submit" value="Sort"/>
  </form>
</div>
  

rooms_controller.rb

 def index
  @rooms = Room.order(params[:sort]).paginate(page: params[:page], per_page: 12)
end
  

Также необходимо убедиться, что params[:sort] включено только в доступные значения,
например:

  sort = params[:sort]
 sort = nil unless sort.in?(['distance', 'name', 'price', 'price desc', 'review'])
 @rooms = Room.order(sort).paginate(page: params[:page], per_page: 12)
  

Рассмотрите возможность использования отдельной области для сортировки или какого-либо драгоценного камня. например, ransack

Комментарии:

1. Большое вам спасибо!!! Это помогло мне выделить! Мне все еще нужно выяснить, как выполнить сортировку в соответствии с «моделью отзывов», в которой есть два столбца «комментарий: текст» и «звезды: целое число», и я должен выяснить, как обойти геокодер gem и «расстояние». Но наконец-то у меня есть отправная точка! Еще раз спасибо! Это сводило меня с ума! 😉