Вопрос:

Порядок столбцов результатов из вызова rails ActiveRecord find_by_sql

sql ruby-on-rails ruby activerecord

2437 просмотра

4 ответа

365 Репутация автора

Я пытаюсь собрать несколько базовых экранов отчетов. У меня есть несколько довольно сложных SQL-запросов, которые я использую в методе ActiveRecord find_by_sql. Проблема, с которой я столкнулся, заключается в том, что я теряю порядок столбцов, указанный в исходном запросе. Я предполагаю, что это потому, что класс Hash не сохраняет порядок ввода своих ключей.

Есть ли способ обойти эту проблему? Должен ли я использовать другой метод, чем find_by_sql для моих запросов?

Автор: Jeff Waltzer Источник Размещён: 16.10.2008 05:40

Ответы (4)


0 плюса

12002 Репутация автора

Как вы создаете эти "экраны отчетов"? Это эрб шаблоны? Вы просто вызываете .each для столбцов, чтобы распечатать их все?

Если это так, вы можете переопределить метод columns () в своих моделях для возврата упорядоченного массива.

Автор: Mike Deck Размещён: 16.10.2008 06:40

3 плюса

16933 Репутация автора

Мне нравится использовать Ruport для отчетов. Он имеет хорошую интеграцию ActiveRecord и позволяет вам контролировать порядок столбцов и многое другое. И его достаточно просто использовать, и я не считаю это излишним даже для «базовых» отчетов.

Автор: Avdi Размещён: 16.10.2008 07:08

2 плюса

43455 Репутация автора

Решение

Вы правы в том, что Ruby Hash не сохраняет порядок. На самом деле это часть дела - вы получаете доступ к нему с помощью ключа.

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

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

Чтобы получить что-то вроде ярлыка, упомянутого выше, я полагаю, вы можете создать массив символов в требуемом порядке и извлечь значения из хеша в цикле. Что-то вроде этого? (прошу прощения за потенциально хитрый эрб: я хамл- пользователь!)

<% for row in @report.rows %>
    <tr>
    <% for col in [:a, :b, :c] %>
        <td><%= row[col] %></td>
    <% end %>
    </tr>
<% end %>
Автор: Mike Woodhouse Размещён: 16.10.2008 07:21

1 плюс

322 Репутация автора

В рельсах 3.2 и выше вы можете использовать attribute_namesдля каждой записи find_by_sqlрезультатов. Это задокументировано в find_by_sql :

Выполняет пользовательский SQL-запрос к вашей базе данных и возвращает все результаты. Результаты будут возвращены в виде массива с запрошенными столбцами, инкапсулированными как атрибуты модели, из которой вы вызываете этот метод. Если вы позвоните, Product.find_by_sqlрезультаты будут возвращены в Productобъекте с атрибутами, указанными в запросе SQL.

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

Для моделей вы можете использовать column_names. Для получения дополнительной информации о вариантах см. Другой ответ SA: Как вы обнаруживаете атрибуты модели в Rails

Автор: Stan Brajewski Размещён: 22.03.2016 11:48
Вопросы из категории :
32x32