什么是创建与查询而不是表相关联的模型的最佳方法

时间:2014-04-29 21:04:27

标签: ruby-on-rails ruby-on-rails-4

我正在尝试使用Rails 4创建报告应用。 作为一个报告系统,它有很多SQL查询,其结果与任何表模式都不同。我的意思是,一个选择查询,我有一些连接,联合等等,结果将像一行,其中的列是子查询,总和等的结果。

是否可以使模型没有关联的表,但我可以使用" find_by_sql"在它上面,用我的查询结果实现该模型的数组? 类似的东西:

使用"选择table1.field1,sum(if(...,table2.field,...)作为field2,作为field3从...."作为查询,并返回一个数组一个模型"结果",我可以打电话给 array_of_result.first.field3?

很抱歉,如果我写得不够清楚。

编辑:直到现在,Sparky的anwser(http://railscasts.com/episodes/193-tableless-model)是最接近的一个,因为我想使用一些ActiveRecord功能,比如指定一个连接上课(甚至是超级课程)。

2 个答案:

答案 0 :(得分:1)

对于纯报告,特别是当结果列名称跨越多个模型时,一种替代方法是直接传递查询并处理结果集:

ActiveRecord::Base.connection.execute([raw SQL query])

您将返回一个结果集,该结果集通常是一组可枚举的行结果,但请查看数据库适配器的文档,以确定它返回的内容。

例如,如果您使用PostgreSQL作为数据库使用pg gem,那么您将获得PG::Result的实例,然后您可以在以下操作方式:

 > results = ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM customers")
=> <PG:Result >
 > results.count
=> 63   # the number of customers I have in this contrived example
 > results.first
=> { "count": "63" }
 > results[0]
=> { "count": "63" }
 > results[0]["count"]
=> "63"

您需要将返回值转换为字符串以外的其他值。 ActiveRecord通常会在您的模型中为您执行此操作,因为它知道列类型,但通过执行原始查询,您可能只需返回您自己必须投射的字符串。如果您只是在某个页面上执行查询以显示它,那么字符串就足够了。

我确定你会做更复杂的报告,但是你会在我的简单例子中注意到,关键count最终被创建为结果的访问者SELECT COUNT...查询。如果指定列名称或别名,则生成的哈希集中的键将匹配列名称或您设置的别名。

答案 1 :(得分:0)

您当然可以创建报告模型。

您可能希望从创建无表格模型开始。从本质上讲,这可以像使用

的models目录中的文件一样简单
class Reporting
end

在其中,以及具有一些适当的操作和视图的控制器。但是,看看

http://railscasts.com/episodes/193-tableless-model

http://railscasts.com/episodes/219-active-model

其中包括无表格模型以及您可以使用活动模型对验证等进行的操作。

在你的情况下,你说你有一些复杂的连接等。有时在短期内更容易SQLize这些,但如果你可以使用activerecord你应该。除此之外,这将允许您在模型中定义自定义方法,您可以链接并使报表控制器更清晰