2009-06-24 90 views
2

我在Ruby on Rails应用程序中构建了一个报表,我正在努力理解如何使用子查询。Rails报表生成中的子查询

每个'调查'has_many'SurveyResponses',它很容易检索这些,但我需要根据其中一个字段'jobcode'进行分组,因为我只想报告与单个职位代码相关的信息在报告的一行中。

但是,我还需要知道构成该职位代码总数的组成数据。原因是我需要计算中位数和标准差等数据,因此需要知道总数的值。

我的想法是,我检索调查报告的不同工作代码,然后当我循环浏览这些检索每个工作代码的单个回复。

这是做到这一点的正确方法还是应该遵循不同的方法?

回答

2

你可以使用一个命名范围,简化得到的答复组:

named_scope :job_group, lambda{|job_code| {:conditions => ["job_code = ?", job_code]}} 

假如把它放在你的反应模型,A和使用它像这样:

job.responses.job_group('some job code') 

,你会得到一系列的回应。如果你希望得到的响应中的一个属性的值的平均值,则可以使用地图:

r = job.responses.job_group('some job code') 
r.map(&:total) 
=> [1, 5, 3, 8] 

或者,你可能会发现它更快地编写自定义的SQL,以获得属性组的平均值/平均值/总和。通过这种工作的轨道可能会导致严重的滞后。

ActiveRecord::Base.connection.execute("Custom SQL here") 
1

您还可以使用Model.find_by_sql()

例如:

class User < Activerecord::Base 
    # Your usual AR model 
end 

...

def index 
    @users = User.find_by_sql "select * from users" 
    # etc 
end