来自rails ActiveRecord find_by_sql调用的结果的列顺序

时间:2008-10-16 17:40:48

标签: sql ruby-on-rails ruby activerecord

我正在尝试整理一些基本的报告屏幕。我有一些相当复杂的SQL查询,我正在使用ActiveRecord的find_by_sql方法。我在这里遇到的问题是我丢失了原始查询中给出的列的顺序。我假设这是因为Hash类不保留其键的输入顺序。

有解决这个问题的方法吗?我应该使用不同的方法,然后使用find_by_sql查询我的查询吗?

4 个答案:

答案 0 :(得分:3)

我喜欢使用Ruport进行举报。它具有良好的ActiveRecord集成,它使您能够控制列顺序和其他任何东西。而且使用起来非常简单,即使对于“基本”报告,我也不认为它有点过分。

答案 1 :(得分:2)

你是正确的,因为Ruby Hash不保留顺序。这是关键所在,实际上 - 您可以使用密钥访问它。

我假设您的查询是为了按照您想要输出的顺序传递列而您希望通过循环输出值?看起来像一个体面的想法,但我想不出一种方法来实现它,没有至少一些额外的工作。

我建议的是在模板中按键显式访问列,因为你可能最终会使用辅助函数(如number_with_delimiter)来应用样式,格式化等等。

为了获得类似上面提到的快捷方式,我想你可以按照所需的顺序创建一个符号数组,并在循环中将值从哈希中拉出来。像这样的东西? (请原谅潜在的狡猾的错误:我是haml用户!)

<% for row in @report.rows %>
    <tr>
    <% for col in [:a, :b, :c] %>
        <td><%= row[col] %></td>
    <% end %>
    </tr>
<% end %>

答案 2 :(得分:1)

在rails 3.2及更高版本中,您可以对attribute_names结果的每条记录使用find_by_sql。 这在find_by_sql

中有记录
  

对您的数据库执行自定义SQL查询并返回所有   结果。结果将作为包含列的数组返回   请求封装为您调用此方法的模型的属性   从。如果您致电Product.find_by_sql,结果将是   在Product对象中返回,其中包含您在中指定的属性   SQL查询。

     

如果你调用一个跨越多个表的复杂SQL查询   SELECT指定的列将是模型的属性,   它们是否是相应表格的列

对于模型,您可以使用column_names。有关变体的更多信息,请参阅其他SA答案:How do you discover model attributes in Rails

答案 3 :(得分:0)

您是如何创建这些“报告屏幕”的?他们是erb模板吗?你只是在列上调用.each来打印它们吗?

如果是这种情况,您可以覆盖模型中的columns()方法以返回有序数组。