1

Я пытаюсь найти коллекцию «недоплаченных» событий в нашей системе. Мы запускаем Rails 3.2 с использованием базы данных Postgres.Активная запись: поиск коллекции по сумме двух связанных таблиц

Структура данных выглядит следующим образом.

class Event < ActiveRecord::Base 
    has_many :charges 
    has_many :transactions 
end 

class Charge < ActiveRecord::Base 
    belongs_to :event 
end 

class Transaction < ActiveRecord::Base 
    belongs_to :event 
end 

Недоплаченные события определяются как те, в которых общие сборы превышают общие транзакции.

sum(charges.total) > sum(transactions.total) 

Мои умения SQL плохой, и я пытался выполнить это с помощью ActiveRecord. Это моя последняя попытка, но она не возвращает правильную коллекцию. В частности, это, как представляется, включает полностью оплаченные события, в которых было более одной транзакции.

Event.joins(:charges,:transactions).group('charges.event_id, transactions.event_id').having("sum(charges.total) > sum(transactions.total)") 

Возможно ли достичь этого в ActiveRecord, и если да, то как я могу это сделать?

ответ

1

Эй, я думаю, что в SQL должно быть как то

select * from events where 
(select sum(charges.total) from charges where charges.event_id = events.id) > 
(select sum(transactions.total) from transactions where 
transactions.event_id = events.id) 

так сейчас вы можете создать сферу, как

scope :unpaid, find_by_sql("select * from events where 
(select sum(charges.total) from charges where charges.event_id = events.id) > 
(select sum(transactions.total) from transactions where 
transactions.event_id = events.id)") 

Я надеюсь, что это поможет!

Смежные вопросы