Как сортировать при получении коллекции моделей? - PullRequest
1 голос
/ 08 июня 2011

У меня есть вызов для моего действия индекса posts_controller.rb:

@articles = Article.order("id desc")

Теперь я хочу иметь возможность сделать заказ по:

date
id
some_counter_attribute

Моя строка запроса будет иметь вид сортировки = дата/ id / count как:

www.example.com/articles/?sort=date

Как мне теперь реализовать это в моем контроллере?Должен ли я просто использовать операторы if?

if params[:sort] == "date"
  @articles = Article.order("created_at desc")
elsif params[:sort] == "count"
  @articles = ...
..

Или есть лучший способ?Должна ли эта логика быть в контроллере или модели в идеале?

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Попробуйте это:

class ArticlesController

  def index
    @articles = Article.order(sort_order)
  end        

private

  def sort_order
    @@sort_order ||= { 
      "date" => "created_at DESC",
      "id"   => "id DESC",
      "comments" => "comment_count ASC"
    }
    @@sort_order[params[:sort]]
  end

end

Конечно, есть жемчужины для таких вещей:

MetaSearch

SearchLogic

1 голос
/ 08 июня 2011

Прямой подход может быть:

@articles = Article.order("#{params[:sort]} desc")

Но для "даты" вы должны отсортировать по create_at.Итак, попробуйте это:

mylist = {"date" => "created_at",
          "id" => "id",
          "counter" => "some_counter_attribute"}

@articles = Article.order("#{mylist[params[:sort]]} desc")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...