請求書に多くのアイテムと支払いがある請求書発行アプリケーションを構築しています。
私のインデックス ビューでは、2 つの仮想属性を含むすべての請求書のリストを表示しています。
def total
items.sum { |item| item.total }
end
def balance
self.payments.sum(:amount) - self.total
end
インデックス ビューを表示するには、非常に多くの SQL が必要であることに気付きました。代わりに、さらに 2 つのテーブル列を作成することをお勧めしますか? これまでのところ、冗長なデータが多すぎるのが好きではないので、そうしないことにしました。
これは私のコントローラーです:
def index
result = current_user.invoices.includes(:items, :payments)
@invoices = paginate(result)
end
index.html.erb :
<table id="index">
<thead>
<tr>
<th>Number</th>
<th>Date</th>
<th>Total</th>
<th>Balance</th>
<th></th>
</tr>
</thead>
<tbody>
<%= render @invoices %>
</tbody>
</table>
<%= will_paginate @invoices %>
_invoice.html.erb :
<tr>
<td>
<%= link_to invoice.number, invoice_path(invoice) %>
</td>
<td>
<%= l invoice.date %>
</td>
<td>
<%= number_to_currency(invoice.total) %>
</td>
<td>
<%= number_to_currency(invoice.balance) %>
</td>
<td>
<%= destroy_link(invoice) %>
</td>
</tr>
インデックス ビューの請求書ごとに、次の 4 つの SQL クエリが生成されます。
(0.1ms) SELECT SUM("payments"."amount") AS sum_id FROM "payments" WHERE "payments"."invoice_id" = 19
CACHE (0.0ms) SELECT "items".* FROM "items" WHERE "items"."invoice_id" = 19
CACHE (0.0ms) SELECT SUM("payments"."amount") AS sum_id FROM "payments" WHERE "payments"."invoice_id" = 19
CACHE (0.0ms) SELECT "items".* FROM "items" WHERE "items"."invoice_id" = 19
(これにより、インデックス ページごとに 40 の SQL クエリが作成されます。)
私は Rails に比較的慣れていないことを認めなければなりません。それで、従うべきベストプラクティスがあるのだろうか?