好的,所以我想在我的 Rails 应用程序中提出一些复杂的查询。我有四个表:Clients、Projects、Invoices、Invoice_Line_Items。我正在尝试从所有这些表中获取某些数据位,并将其显示在我的应用程序的“报告”类型视图中。这是四个表的结构:
客户
| id | name | archive |
----------------------------------------
| 1 | Client 1 | 0 |
| 2 | Client 2 | 0 |
项目
| id | client_id | name | archive |
------------------------------------------------------
| 1 | 1 | Project 1 | 0 |
| 2 | 1 | Project 2 | 1 |
| 3 | 2 | Project 3 | 0 |
| 4 | 2 | Project 4 | 1 |
发票
| id | client_id | project_id | name | archive |
----------------------------------------------------------------------
| 1 | 1 | 1 | Invoice 1 | 0 |
| 2 | 1 | 1 | Invoice 2 | 0 |
| 3 | 1 | 2 | Invoice 3 | 1 |
| 4 | 1 | 2 | Invoice 4 | 1 |
| 5 | 2 | 3 | Invoice 5 | 0 |
| 6 | 2 | 3 | Invoice 6 | 0 |
| 7 | 2 | 4 | Invoice 7 | 1 |
| 8 | 2 | 4 | Invoice 8 | 1 |
Invoice_Line_Items
| id | invoice_id | name | amount_due |
---------------------------------------------------------
| 1 | 1 | Item 1 | 500 |
| 2 | 1 | Item 2 | 500 |
| 3 | 2 | Item 3 | 500 |
| 4 | 2 | Item 4 | 500 |
| 5 | 3 | Item 5 | 500 |
| 6 | 3 | Item 6 | 500 |
| 7 | 4 | Item 7 | 500 |
| 8 | 4 | Item 8 | 500 |
| 9 | 5 | Item 9 | 500 |
| 10 | 5 | Item 10 | 500 |
| 11 | 6 | Item 11 | 500 |
| 12 | 6 | Item 12 | 500 |
| 13 | 7 | Item 13 | 500 |
| 14 | 7 | Item 14 | 500 |
| 15 | 8 | Item 15 | 500 |
| 16 | 8 | Item 16 | 500 |
好的,希望这些图表足够有意义。我正在寻找的结果集是这个(示例数据集取自上述示例数据):
| clients.name | current_projects | archived_projects | total_amount_due | total_amount_paid |
-----------------------------------------------------------------------------------------------------------
| Client 1 | 1 | 1 | 2000 | 2000 |
| Client 2 | 1 | 1 | 2000 | 2000 |
好的,这就是那里发生的事情:
- 获取所有未归档的客户端
- 获取所有未归档项目的计数
- 获取所有存档项目的计数
- 从 invoice_line_items 表中获取 total_amount_due,它是所有未归档发票的总和
- 从 invoice_line_items 表中获取 total_amount_paid,它是所有存档发票的总和
我对 Rails 比较陌生,这是一个相当复杂的查询(至少在我的脑海中)。请让我知道是否有一个我忽略的更简单的解决方案,或者我是否过于复杂。如果我需要在我的控制器中执行多个查询,那很好,我只是想看看我是否可以通过一个 sql 调用逃脱。我很确定我可以用一些子查询很容易地做到这一点,但我不确定如何在 Rails 的控制器中编写这些子查询。
感谢您提供的任何帮助或指导,如果这个问题只是令人发指或只是让我知道,我会删除它并去搜索更多谷歌(已经尝试无济于事)。