【发布时间】:2012-11-06 10:51:25
【问题描述】:
我正在尝试为 Web 服务分组数据。
Web 服务在 Ruby on Rails 上运行,我在我的 API 控制器中工作(我们将其称为我的 projects_controller 的索引操作。
表架构如下所示(由于 NDA 原因,数据类型和示例已更改)。不幸的是,这里的示例建议我将员工和项目分成不同的表,但现在请忽略这一点。这是给我的数据:
COLUMNS:
employee, e_id, company, hire_date, project_name, project_due_date
ROWS:
John, 12345, XYZ, 01-01-2001, Project_A, 12-31-2012
John, 12345, XYZ, 01-01-2001, Project_B, 03-15-2013
John, 12345, XYZ, 01-01-2001, Project_C, 06-25-2013
Jane, 98765, XYZ, 05-22-2003, Project_Q, 01-15-2013
Jane, 98765, XYZ, 05-22-2003, Project_W, 02-25-2013
Jane, 98765, XYZ, 05-22-2003, Project_E, 08-01-2013
为了减少数据传输,我想将上面的返回如下:
[
{
"employee":"John",
"e_id":"12345",
"company":"XYZ",
"hire_date":"01-01-2001",
"projects":[
{ "project_name":"Project_A", "project_due_date":"12-31-2012" },
{ "project_name":"Project_B", "project_due_date":"03-15-2013" },
{ "project_name":"Project_C", "project_due_date":"06-25-2013" }
]
},
{
"employee":"Jane",
"e_id":"98765",
"company":"XYZ",
"hire_date":"05-22-2003",
"projects":[
{ "project_name":"Project_Q", "project_due_date":"01-15-2013" },
{ "project_name":"Project_W", "project_due_date":"02-25-2013" },
{ "project_name":"Project_E", "project_due_date":"08-01-2013" }
]
}
]
我似乎无法找出将我的 SQL 查询结果(行)分组到理想数据中的有组织散列的最佳方法。我想我需要一些 .each 和哈希来对我的 SQL 调用返回的数据进行后处理,但我似乎无法弄清楚“Ruby”的方式(我也不是一个经验丰富的 Ruby 开发人员,所以任何参考链接也将不胜感激,因此我可以阅读解决方案)。
我怎样才能做到这一点?
[编辑]
我正在对 Project 对象执行 SQL 查询。我的控制器如下:
def index
sql = "SELECT employee, e_id, company, hire_date, project_name, project_due_date
FROM projects
AND created_at = (SELECT created_at FROM projects ORDER BY created_at DESC LIMIT 1)
ORDER BY company, employee, project_due_date"
result = Project.find_by_sql(sql)
respond_with(result)
end
我得到的数据是一堆Project对象,格式如下
红宝石调试器:
(rdb:2) result
[#<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_A", project_due_date: "12-31-2012">,
#<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_B", project_due_date: "03-15-2013">,
#<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_C", project_due_date: "06-25-2013">,
#<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_Q", project_due_date: "01-15-2013">,
#<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_W", project_due_date: "02-25-2013">,
#<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_E", project_due_date: "08-01-2013">]
[编辑 2]
我知道我可以用一种非常天真的、非 Ruby 的方式解决这个问题,但我想知道让它工作的正确方法。一个基本的解决方案可能包括遍历结果数组并逐行解析数据,将员工数据保存到临时哈希,并将他们的项目数据保存到哈希数组。当迭代涉及新员工时,将前一个员工数据的数据保存在一个数组中,并为下一个员工重置临时数组/哈希。非常丑陋,但很有可能。
但是,必须有 Ruby 方式。请帮忙!
【问题讨论】:
-
SQL 结果是单个文本吗?您拥有的 Ruby 对象到底是什么?
-
您使用的是 Rails 还是其他框架?哪个数据库?任何 ORM,还是您想要一个带有纯 SQL 查询的解决方案?到目前为止,您尝试过什么?
-
@sawa 我在原始帖子“Edit”的底部添加了一个部分,其中包含更多信息。希望这能澄清更多。
-
@padde Web 服务 API 是使用 Ruby on Rails 编写的。数据库是 SQLITE3。在原帖中查看我的Edit。希望这能更好地描述我的问题。我不完全确定最好的解决方案是什么(事实上我现在完全陷入困境)。如果使用纯 SQL 解决这个问题,那很好。我更喜欢提供最快响应时间的解决方案,因为这是一个将从移动设备调用的 API。谢谢!
标签: sql ruby-on-rails ruby hashmap hashtable