这是我的情况.我有两个表:承诺和pledge_transactions.当用户做出承诺时,他在承诺表中只有一行.
稍后到达承诺时,每笔付款都记录在我的pledge_transactions表中.
我需要能够查询所有未结承诺,这意味着交易表中的金额总和小于质押金额.
这是我到目前为止所拥有的:
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承认pledge_transactions表的条件下,它完全忽略了它,这意味着我的having子句变得毫无意义.
我的信念是我遇到了ActiveRecord的缺点.
最终我需要能够做到以下几点:
> Pledge.open
> Pledge.open.count
> Pledge.open.find(:all,…)
>等
有人对这个问题有更优雅的答案吗?请勿在每次交易发生时增加认捐额度_given字段.这感觉就像一个创可贴的方法,而且我更倾向于在创建和计算差异后保持承诺的静态.
如果我没有在这里使用Rails,我只是创建一个视图并完成它.
谢谢!
最佳答案 如何定义:transactions关联?它是否规定:class_name =’PledgeTransaction'(或者类是什么,如果它使用set_table_name)?
你看过:join参数了吗?我想这可能就是你要找的东西.当然是:条件事情看起来不对劲.
If I weren’t using Rails here, I’d just create a view and be done with it
仅仅因为它的Rails并不意味着你不能使用视图.好吧,根据它的构造方式,你可能无法更新它,但除此之外.您也可以在迁移中创建和删除视图:
class CreateReallyUsefulView < ActiveRecord::Migration
def self.up
# this is Oracle, I don't know if CREATE OR REPLACE is widely-supported
sql = %{
CREATE OR REPLACE VIEW really_usefuls AS
SELECT
... blah blah SQL blah
}
execute sql
end
def self.down
execute 'drop view really_usefuls'
end
end
class ReallyUseful < ActiveRecord::Base
# all the usual stuff here, considering overriding the C, U and D parts
# of CRUD if it's supposed to be read-only and you're paranoid
end
我认为书籍/文档不会涉及这么多,因为不同平台的视图实现和支持差异很大.