これが私の状況です。pledges と pledge_transactions の 2 つのテーブルがあります。ユーザーが誓約を行うと、誓約テーブルには行しかありません。
後で誓約を履行するときが来たら、各支払いは私の pledge_transactions テーブルに記録されます。
すべてのオープンなプレッジを照会できるようにする必要があります。これは、トランザクション テーブル内の金額の合計がプレッジ額より少ないことを意味します。
これが私がこれまでに持っているものです:
named_scope :open,
:group => 'pledges.id',
:include => :transactions,
:select => 'pledge_transactions.*',
:conditions => 'pledge_transactions.id is not null or pledge_transactions.id is null',
:having => 'sum(pledge_transactions.amount) < pledges.amount or sum(pledge_transactions.amount) is null'
余計でばかげた条件オプションを指定した理由を自問するかもしれません。答えは、ActiveRecord が条件で pledge_transactions テーブルを確認するように強制しない場合、それは完全に省略されます。つまり、having 句は無意味になります。
私の考えでは、ActiveRecord の欠点に遭遇したと思います。
最終的には、次のことができる必要があります。
- Pledge.open
- Pledge.open.count
- Pledge.open.find(:all, ...)
- 等
この問題に対するよりエレガントな答えを持っている人はいますか? トランザクションが発生するたびにプレッジの amount_given フィールドを増やすという提案はしないでください。それは一時しのぎのアプローチのように感じます。私は、誓約が作成された後も静的に維持し、差額を計算する方がはるかに好きです。
ここで Rails を使用していなければ、ビューを作成するだけで済みます。
ありがとう!