3 modele: User, Bet, Bid. Relacje mniej więcej takie:
User has many bets (created).
User has many bids.
User has many bidded_bets (through: “bids”, source: “bet”) (participated).
Bet has many bids.
A potrzebuję uzyskać sumę obstawień we wszystkich zakładach danego usera (ale tylko zakładach spełniających pewne warunki).
Kombinuję tak:
bidded_bets.visible.bids.sum(:amount)
Czyli:
- weź wszystkie zakłady usera,
- odfiltruj tylko spełniające warunki (visible to named scope),
- weź wszystkie obstawienia tych zakładów,
- oblicz sumę
Niestety zonk: bidded_bets.visible zwróci kolekcję a .bids operuje na pojedynczym obiekcie i się nie dogadają .
Jak więc to zrobić, żeby efektem było takie zapytanie:
SELECT SUM(amount) AS `total` FROM `bids` AS `bid` LEFT JOIN `bets` ON (`bets`.`id` = `bid`.`bet_id`) WHERE `bid`.`user_id` = '1' AND `bets`.`status` IN ('pending','awaiting','created')