活动记录:根据两个关联表的总和查找集合

时间:2013-05-18 08:30:54

标签: sql ruby-on-rails postgresql activerecord ruby-on-rails-3.2

我正在尝试在我们的系统中找到“欠薪”事件的集合。我们使用Postgres数据库运行Rails 3.2。

数据结构如下。

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 个答案:

答案 0 :(得分: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)")

我希望它会有所帮助!