Предварительная сортировка ассоциаций в контроллере: как и прирост производительности? - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть представление, которое проходит через @regions. Для каждого региона отображаются его страны.

<% region.countries.each do |country| %>

Новым требованием является сортировка стран по некоторому столбцу, для которого у меня есть область действия.

<% region.countries.order_alphabetically.each do |country| %>

Однако я слышал, что написание логики в представлениях сильно повлияет на производительность. Это правда для этого случая? Можно ли предварительно отсортировать это в контроллере?

P.S. Я не хочу использовать default_scope, потому что мне нужно отсортировать его по-другому в других представлениях.

РЕДАКТИРОВАТЬ: изменил название, чтобы лучше отражать мой вопрос

Ответы [ 3 ]

0 голосов
/ 20 декабря 2011

Что было бы нежелательно, если бы в 3 разных местах, по вашему мнению, вы указали

region.countries.order(:column_name)

Это попадет в базу данных 3 раза. Некоторые также утверждают, что вы заставляете представление делать слишком много. Вы можете решить обе проблемы, выполнив

@sorted_countries = region.countries.order(:column_name)

Вы сохраняете особенности того, как упорядочить вне представления, и повторное использование того же отношения активная запись будет кэшировать отсортированный массив между повторными использованиями.

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

0 голосов
/ 09 февраля 2012

Извините за поздний ответ. Я хотел увидеть некоторые доказательства, поэтому я наконец нашел время сесть и написать сравнительное сравнение двух: сортировка в поле зрения и демонстрация контроллера .

На странице много регионов, у каждого региона много стран. На странице отображаются все из них, сортировка стран по названию для каждого региона. Запустите rake test:benchmark, и результаты будут сохранены в папке tmp / performance. Результаты двух одинаковы, около 0,0035 на страницу рендеринга.

Итак, в итоге, вызов области сортировки с учетом VS в контроллере не влияет на производительность.

0 голосов
/ 20 декабря 2011

Вероятность того, что это быстрее, зависит от того, сколько записей у вас в таблице и индексируются ли вы по этому столбцу. Вы можете поэкспериментировать с передачей этой нагрузки в базу данных, выполнив:

region.countries.order(:column_name)

В большинстве случаев это должно быть быстрее, чем загрузка всех записей в Ruby и сортировка.

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