来自rails ActiveRecord find_by_sql调用的结果的列顺序
-
03-07-2019 - |
题
我正在尝试整理一些基本的报告屏幕。我有一些相当复杂的SQL查询,我正在使用ActiveRecord的find_by_sql方法。我在这里遇到的问题是我丢失了原始查询中给出的列的顺序。我假设这是因为Hash类不保留其键的输入顺序。
有解决这个问题的方法吗?我应该使用不同的方法,然后使用find_by_sql查询我的查询吗?
解决方案
你是正确的,因为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 %>
其他提示
我喜欢使用 Ruport 进行报道。它具有良好的ActiveRecord集成,它使您能够控制列顺序和其他任何东西。并且使用起来非常简单,即使对于“基本”而言,我也不认为它过于苛刻。报告。
在rails 3.2及更高版本中,您可以对 find_by_sql
结果的每条记录使用 attribute_names
。
这在 find_by_sql 中有记录:
对您的数据库执行自定义SQL查询并返回所有 结果。结果将作为包含列的数组返回 请求封装为您调用此方法的模型的属性 从。如果您调用
Product.find_by_sql
,那么结果将是 在Product
对象中返回,其中包含您在中指定的属性 SQL查询。如果你调用一个跨越多个表的复杂SQL查询 SELECT指定的列将是模型的属性, 它们是否是相应表格的列
对于模型,您可以使用column_names。有关变化的更多信息,请参阅其他SA答案:如何发现模型Rails中的属性
您是如何创建这些“报告屏幕”的?他们是erb模板吗?你只是在列上调用.each来打印它们吗?
如果是这种情况,您可以覆盖模型中的columns()方法以返回有序数组。