我正在尝试将一些基本的报告屏幕组合在一起。我有一些相当复杂的SQL查询,我正在将它们输入到ActiveRecord的find_by_SQL方法中。我在这里遇到的问题是,我丢失了原始查询中给出的列的顺序。我假设这是因为Hash类不保留其密钥的入口顺序。
有办法解决这个问题吗?我应该使用不同的方法来进行查询吗?
我喜欢使用Ruport进行报告。它具有良好的ActiveRecord集成,使您能够控制列顺序和几乎所有其他内容。而且它的使用非常简单,即使对于"基本"报告,我也不认为它过于夸张。
您的正确之处在于Ruby哈希不保留顺序。这是重点的一部分,真的——你可以用钥匙访问它。
我假设您的查询是按照您想要输出列的顺序编写的,并且您希望通过循环输出值?这似乎是一个不错的想法,但如果没有一些额外的工作,我想不出实现它的方法。
我建议您通过模板中的键显式访问列,因为您最终可能会应用样式,使用number_with_delimiter等辅助函数进行格式化,诸如此类。
要获得类似上面提到的快捷方式,我想您可以按照所需的顺序创建一个符号数组,并在循环中从哈希中提取值。像这样的东西?(请原谅潜在的狡猾的erb:我是一个haml用户!)
<% for row in @report.rows %>
<tr>
<% for col in [:a, :b, :c] %>
<td><%= row[col] %></td>
<% end %>
</tr>
<% end %>
在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模板吗?你只是在每一列上打电话把它们全部打印出来吗?
如果是这种情况,您可以重写模型中的columns()方法以返回有序数组。