Как вы обычно сортируете предметы в Rails? - PullRequest
27 голосов
/ 18 марта 2009

У меня есть небольшой пример приложения Rails под названием tickets, который просматривает и редактирует вымышленные билеты, продаваемые различным клиентам. В tickets_controller.rb, внутри def index, у меня есть эта стандартная строка, сгенерированная скаффолдингами:

@tickets = Ticket.find(:all)

Чтобы отсортировать билеты по имени, я нашел два возможных подхода. Вы можете сделать это следующим образом:

@tickets = Ticket.find(:all, :order => 'name')

... или так:

@tickets = Ticket.find(:all).sort!{|t1,t2|t1.name <=> t2.name}

(Совет: документация Ruby объясняет, что sort! изменит массив, который он сортирует, в отличие от одного sort, который возвращает отсортированный массив, но оставляет оригинал без изменений).

Какую стратегию вы обычно используете? Когда вы могли бы использовать .sort! против синтаксиса :order => 'criteria'?

Ответы [ 2 ]

34 голосов
/ 18 марта 2009

Используйте :order => 'criteria' для всего простого, что может быть сделано базой данных (т. Е. Базовый алфавитный или хронологический порядок). Скорее всего, это намного быстрее, чем позволить вашему Ruby-коду сделать это, при условии, что у вас есть правильные индексы.

Единственный раз, когда я мог подумать, что вам следует использовать метод sort, это если у вас есть сложный атрибут, который вычисляется во время выполнения и не сохраняется в базе данных, например, «значение достоверности», основанное на количестве хороших / плохих ответы или что-то. В этом случае лучше использовать метод sort, но имейте в виду, что это все испортит, если у вас есть нумерация страниц (каждая страница будет иметь свои результаты по порядку, но набор страниц в целом будет вне заказ).

2 голосов
/ 18 марта 2009

Я указываю порядок в искателе ActiveRecord или в ассоциации моделей, потому что сортировка с использованием SQL выполняется быстрее. Вы должны воспользоваться возможностями, предлагаемыми СУБД, когда сможете это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...