0

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 クエリの結果 (行) を、理想的なデータに含まれる整理されたハッシュにグループ化する最良の方法がわかりません。SQL呼び出しによって返されたデータを後処理するには、いくつかの.eachとハッシュが必要だと思いますが、「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 の方法が必要です。助けてください!

4

1 に答える 1