0

我正在尝试构建一个网络应用程序来分析有关电影的调查结果,这些结果由管理员手动上传到系统。结果根据调查的日期上传。调查了许多不同的类别,每个受访者为每个类别、每部电影输入一个数字回答(从 1 到 7)。我已经设置了系统,以便在电影索引页面上,您可以选择一部电影,它会将您带到网站上该特定电影的放映页面。我想做的是让系统在表格中仅显示基于每个字段日期的调查结果的平均值(按类别)。

管理员输入的示例原始结果:

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>

目前显示管理员上传的所有原始值。我想我需要使用 average 方法和 :group 选项,但是由于某种原因,当我尝试使用它时,它总是给我错误。我认为 DATE_TRUNC 不起作用,因为我使用的是 sqlite3,但我不确定这是否是正确的推理。

任何帮助将不胜感激(甚至链接到相应的文档)!谢谢!

4

2 回答 2

0

ActiveRecord 确实具有average查找的平均值并允许诸如 :group. 但是,它一次只适用于一列。
对于这种情况,通常建议您自己进行 sql 查询,或者使用如下可链接的东西:

@fields = Field.group('DATE(field_date)').
  select('avg(interesting) as interesting, 
         avg(funny) as funny,
         avg(trendy) as trendy')

希望能帮助到你。如果有的话,我很想看到一些好的解决方案。:)

于 2013-05-02T21:05:42.970 回答
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在你的控制器中。

于 2013-05-02T21:07:54.383 回答