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


Как вы создаете эти «экраны отчетов»? Это шаблоны erb? Вы просто вызываете .each on columns, чтобы распечатать их все?
В этом случае вы можете переопределить метод columns () в своих моделях, чтобы он возвращал упорядоченный массив.
Использование стандартного контроллера / представления рельсов. На данный момент у меня есть отдельный массив имен столбцов, в котором указан порядок, в котором они должны отображаться. Но это не СУХОЙ, поскольку в SQL эти имена столбцов уже указаны в правильном порядке. Должен быть способ получше.
Мне нравится использовать Рупорт для отчетов. Он имеет хорошую интеграцию с ActiveRecord и позволяет вам контролировать порядок столбцов и многое другое. И он достаточно прост в использовании, поэтому я не считаю его излишним даже для «базовых» отчетов.
Вы правы в том, что Ruby Hash не сохраняет порядок. На самом деле это часть сути - вы получаете доступ к нему с помощью ключа.
Я предполагаю, что ваш запрос написан для доставки столбцов в том порядке, в котором вы хотите их выводить, и вы надеялись вывести значения через цикл? Вроде бы неплохая идея, но я не могу придумать, как ее реализовать, по крайней мере, без дополнительной работы.
Я бы порекомендовал явный доступ к столбцам по ключу в вашем шаблоне, поскольку вы, вероятно, собираетесь применять стили, форматирование с помощью вспомогательных функций, таких как number_with_delimiter, и тому подобное.
Чтобы получить что-то вроде упомянутого выше ярлыка, я полагаю, вы могли бы создать массив символов в требуемом порядке и извлекать значения из хэша в цикле. Что-то вроде этого? (прошу прощения за потенциально изворотливого erb: я пользователь хамл!)
<% for row in @report.rows %>
<tr>
<% for col in [:a, :b, :c] %>
<td><%= row[col] %></td>
<% end %>
</tr>
<% end %>
Это то, чем я закончил. У нас есть ряд SQL-запросов для базовых отчетов. Что я хотел сделать, так это настроить так, чтобы мне не приходилось создавать отдельный контроллер / представления для каждого SQL-отчета (страница такая же, за исключением данных, заполняющих ее).
хеш сохраняет порядок в рубине 1.9, я думаю
В rails 3.2 и выше вы можете использовать attribute_names для каждой записи результатов find_by_sql.
Это задокументировано в find_by_sql:
Executes a custom SQL query against your database and returns all the results. The results will be returned as an array with columns requested encapsulated as attributes of the model you call this method from. If you call
Product.find_by_sqlthen the results will be returned in aProductobject with the attributes you specified in the SQL query.If you call a complicated SQL query which spans multiple tables the columns specified by the SELECT will be attributes of the model, whether or not they are columns of the corresponding table
Для моделей вы можете использовать column_names. Для получения дополнительной информации о вариантах см. Другой ответ SA: Как вы обнаруживаете атрибуты модели в Rails
Не могли бы вы объяснить, почему порядок столбцов важен? Я не шучу, мне искренне любопытно.