我正在尝试构建一个网络应用,分析有关电影的调查结果,这些调查结果由管理员手动上传到系统。结果根据调查的日期上传。调查了许多不同的类别,每个受访者为每个电影输入每个类别的数字响应(1-7)。我已经设置了系统,以便在电影索引页面上,您可以选择一部电影,它将带您到该网站上的特定电影的节目页面。我希望能够让系统在表格中仅显示基于每个字段日期的调查结果的平均值(按类别)。
admin输入的原始结果示例:
Field Date: 03/23/2013, Interesting:5, Trendy: 6, Funny: 3
Field Date: 03/23/2013, Interesting:6, Trendy: 6, Funny: 7
Field Date: 03/29/2013, Interesting:2, Trendy: 4, Funny: 3
我想在表格中输出的示例:
Field Date: 03/23/2013, Interesting:5.5, Trendy: 6, Funny: 5
Field Date: 03/29/2013, Interesting:2, Trendy: 4, Funny: 3
这是我的架构:
create_table "movies", :force => true do |t|
t.string "name"
t.string "category"
t.date "field"
end
create_table "results", :force => true do |t|
t.string "name"
t.date "field"
t.integer "movie_id"
t.integer "interesting"
t.integer "trendy"
t.integer "funny"
end
以下是我的电影显示页面中的表格:
<% @results.order('field DESC').each do |resultz| %>
<tr class="tableline" >
<td class="tableline"><%= resultz.field %></td>
<td class="tableline"><%= resultz.interesting %></td>
<td class="tableline"><%= resultz.trendy %></td>
<td class="tableline"><%= resultz.funny %></td>
</tr>
目前显示管理员上传的所有原始值。我想我需要使用平均方法和:group选项,但出于某种原因,当我尝试它时它会一直给我错误。我不认为DATE_TRUNC有效,因为我使用sqlite3,但我不确定这是否是正确的推理。
非常感谢任何帮助(甚至链接到相应的文档)!谢谢!
答案 0 :(得分:0)
ActiveRecord确实有average
来查找列的平均值,并允许:group
等选项。但是,它一次只适用于一列
对于这种情况,通常建议您进行自己的SQL查询,或使用可链接的东西,如下所示:
@fields = Field.group('DATE(field_date)').
select('avg(interesting) as interesting,
avg(funny) as funny,
avg(trendy) as trendy')
希望它有所帮助。如果有的话,我很想看到一些好的解决方案。 :)
答案 1 :(得分:0)
我认为您需要在控制器中执行的SQL查询是:
SELECT field, AVG(interesting), AVG(trendy), AVG(funny) FROM results WHERE movie_id =
<movie_im_at_show_page_for> GROUP BY field
在Rails中看起来像这样:
@results = Results.find(select: "field, AVG(interesting), AVG(trendy), AVG(funny)",
conditions: ["movie_id = ?", <movie_im_at_show_page_for>], group: "field")
您必须将<movie_im_at_show_page_for>
替换为实际ID。我认为在控制器中看起来像@movie.id
。