这是我的情况。我有两个表:承诺和承诺交易。当用户进行质押时,他在质押表中只有一行。
稍后当需要履行承诺时,每笔付款都会记录在我的承诺交易表中。
我需要能够查询所有未完成的质押,这意味着交易表中的金额总和小于质押金额。
这是我到目前为止所拥有的:
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'
您可能会问自己,为什么我指定了那个多余和荒谬的条件选项。答案是,当我不强制 ActiveRecord 确认条件中的质押交易表时,它会完全省略它,这意味着我的 having 子句变得毫无意义。
我的信念是我遇到了 ActiveRecord 的缺点。
最终我需要能够做到以下几点:
- 质押公开
- Pledge.open.count
- Pledge.open.find(:all, ...)
- 等等
有人对这个问题有更优雅的答案吗?请不要建议每次交易发生时增加一个承诺 amount_given 字段。这感觉像是一种创可贴的方法,我更喜欢在创建承诺后保持静止并计算差异。
如果我在这里不使用 Rails,我只需创建一个视图并完成它。
谢谢!