我正在尝试使用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功能,比如指定一个连接上课(甚至是超级课程)。
答案 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你应该。除此之外,这将允许您在模型中定义自定义方法,您可以链接并使报表控制器更清晰