Voici ma situation. J'ai deux tables: les promesses et les promesses de dons. Quand un utilisateur fait une promesse, il n'a qu'une rangée dans la table des promesses.Comment faire pour que named_scope fonctionne correctement avec une table jointe?
Plus tard au moment de remplir le formulaire, chaque paiement est enregistré dans ma table pledge_transactions.
Je dois pouvoir interroger tous les engagements ouverts, ce qui signifie que la somme des montants dans la table des transactions est inférieure au montant promis.
Voici ce que j'ai jusqu'à présent:
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'
Vous pourriez vous demander pourquoi je superflues et que les conditions ridicules option spécifiée. La réponse est que lorsque je ne force pas ActiveRecord à reconnaître la table pledge_transactions dans les conditions, elle l'omet complètement, ce qui signifie que ma clause having devient sans signification. Je crois que j'ai rencontré un défaut d'ActiveRecord.
En fin de compte je dois être en mesure de faire ce qui suit:
- Pledge.open
- Pledge.open.count
- Pledge.open.find (: tous, ...)
- etc.
Quelqu'un at-il une réponse plus élégante à ce problème? S'il vous plaît pas de suggestions d'incrémentation d'un champ amount_given pledges chaque fois qu'une transaction se produit. Cela ressemble à une approche de pansement et je suis beaucoup plus fan de garder l'engagement statique après sa création et de calculer la différence.
Si je n'utilisais pas Rails ici, je créerais simplement une vue et j'en aurais fini avec.
Merci!
James, Idée très intéressante. Cependant, une chose à considérer est qu'une personne dans ce système peut faire un paiement partiel vers leur gage et leur engagement est toujours considéré ouvert. C'est pourquoi j'ai approché le problème avec une somme(). Si la somme des engagements n'est pas égale ou supérieure à la mise en gage, le gage est toujours considéré comme ouvert (non rempli). – rwl4
Hey rwl4, Vous pouvez toujours utiliser la clause NOT EXISTS, j'ai ajouté le montant
jpoz