0

多くのアイテムと支払いを含む請求書があります。

これは私の請求書モデルです(少なくともその一部):

def total
  items.sum { |item| item.total }
end

def balance
  self.payments.sum(:amount) - self.total
end

現在、支払いビューで、残高が 0 未満のすべての請求書を見つけようとしています。

<%= f.select(:invoice_id, current_user.invoices.where("balance > ?", 0)) %>

バランスは列ではないため、これはもちろん機能しません。しかし、そこにメソッドを挿入するにはどうすればよいですか?

助けてくれてありがとう。

4

1 に答える 1

1

いくつかのオプションがあります。いつでもbalance列を作成できます (支払いやアイテムが追加されたときに適切に更新します)。これにより、この種のクエリを効率的に実行できます。

ただし、単純な Ruby アプローチ、具体的にはArray#select. 何かのようなもの

current_user.invoices.to_a.select {|invoice| invoice.balance < 0}

あなたをそこに連れて行きます。ただし、ユーザーが多数の請求書を持っている場合、あまり効率的ではありません。

更新: また、このようにすると、N+1 クエリの状況に遭遇することになります。これは、各請求書がデータベースからアイテムと支払いを取得する必要があるためです。これを回避するには、次のように元のクエリにアイテムと支払いを含める必要があります。

current_user.invoices.includes(:items, :payments).to_a.select{ ... }
于 2012-09-27T12:59:26.343 に答える