【发布时间】:2013-04-01 13:50:18
【问题描述】:
我有一个在 PostgreSQL 上运行的 rails 3.2 应用程序,并且有一些我想在视图中显示的数据,这些数据以这种结构存储在数据库中:
+----+--------+------------------+--------------------+
| id | name | sched_start_date | task |
+----+--------+------------------+--------------------+
| 1 | "Ben" | 2013-03-01 | "Check for debris" |
+----+--------+------------------+--------------------+
| 2 | "Toby" | 2013-03-02 | "Carry out Y1.1" |
+----+--------+------------------+--------------------+
| 3 | "Toby" | 2013-03-03 | "Check oil seals" |
+----+--------+------------------+--------------------+
我想显示每个名称的任务列表,以及名称按 ASC 的第一个 sched_start_date 排序,看起来应该像 ...
我开始采用的方法是对唯一名称运行查询并按sched_start_date ASC 对其进行排序,然后对每个名称运行查询以获取其任务。
要获取唯一名称列表,SQL 应如下所示。
select *
from (
select distinct on (name) name, sched_start_date
from tasks
) p
order by sched_start_date;
我想知道这是否是正确的方法(查询唯一名称,然后针对他们的所有任务运行另一个查询),或者是否有更好的 rails 方法。
【问题讨论】:
-
我认为您的第一个问题是您的数据库似乎没有正确规范化。除了
tasks,您可能还应该有一个mechanics或technicians表,其中存储了Ben和Toby。然后,在tasks中,不是有一个name列,而是有一个引用mechanic的mechanic_id列。 -
然后你可以这样做:在你的控制器中,设置
@mechanics = Mechanic.all,然后在视图中,设置<% @mechanics.each do |mechanic| %><%= mechanic.name %><% mechanic.tasks.each do |task| %><%= task.description %><% end %><% end%>。 (我还建议将tasks.task更改为tasks.description。) -
哦,我的意思是在我的第一条评论中链接这个:databases.about.com/od/specificproducts/a/normalization.htm
标签: sql ruby-on-rails postgresql activerecord sql-order-by