Порядок столбцов результатов от вызова rails ActiveRecord find_by_sql - PullRequest
3 голосов
/ 16 октября 2008

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

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

Ответы [ 4 ]

3 голосов
/ 16 октября 2008

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

2 голосов
/ 16 октября 2008

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

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

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

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

<% for row in @report.rows %>
    <tr>
    <% for col in [:a, :b, :c] %>
        <td><%= row[col] %></td>
    <% end %>
    </tr>
<% end %>
1 голос
/ 22 марта 2016

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

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

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

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

0 голосов
/ 16 октября 2008

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

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

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