Das ist meine Situation. Ich habe zwei Tabellen: pledges und pledge_transactions. Wenn ein Benutzer eine Zusage macht, hat er nur eine Zeile in der Tabelle pledges.
Wenn es später an der Zeit ist, die Zusage zu erfüllen, wird jede Zahlung in meiner Tabelle pledge_transactions protokolliert.
Ich muss in der Lage sein, alle offenen Verpfändungen abzufragen, was bedeutet, dass die Summe der Beträge in der Transaktionstabelle geringer ist als der verpfändete Betrag.
Hier ist, was ich bis jetzt habe:
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'
Sie fragen sich vielleicht, warum ich diese überflüssige und lächerliche Option "Bedingungen" angegeben habe. Die Antwort ist, dass, wenn ich ActiveRecord nicht zwinge, die Tabelle pledge_transactions in den Bedingungen zu berücksichtigen, sie komplett ausgelassen wird, was bedeutet, dass meine Having-Klausel bedeutungslos wird.
Ich glaube, dass ich auf eine Schwachstelle von ActiveRecord gestoßen bin.
Letztendlich muss ich in der Lage sein, Folgendes zu tun:
- Verpfänden.öffnen
- Pledge.open.count
- Pledge.open.find(:all, ...)
- usw.
Hat jemand eine elegantere Lösung für dieses Problem? Bitte keine Vorschläge, bei denen das Feld pledges amount_given bei jeder Transaktion inkrementiert wird. Das fühlt sich wie ein Pflaster Ansatz und ich bin viel mehr von einem Fan von halten die Zusage statisch, nachdem es erstellt wird und die Berechnung der Differenz.
Wenn ich hier nicht Rails verwenden würde, würde ich einfach eine Ansicht erstellen und damit fertig sein.
Merci !