Postgresql 映射到ActiveRecord模型的数据库函数
假设我有两个这样的数据库函数(pl/pgsql):Postgresql 映射到ActiveRecord模型的数据库函数,postgresql,activerecord,stored-procedures,ruby-on-rails-4,rails-activerecord,Postgresql,Activerecord,Stored Procedures,Ruby On Rails 4,Rails Activerecord,假设我有两个这样的数据库函数(pl/pgsql): 创建表余额(12,2)默认值0不为空, 费用小数(12,2)默认为0不为空; 创建函数帐户\u余额(id整数) 将余额返回为$$ 挑选 作为租金的总和(如果t.amount>0,则t.amount否则为0结束), 费用总额(如果t.amount0,则t.amount否则为0结束), 费用总额(如果t.amount
创建表余额(12,2)默认值0不为空,
费用小数(12,2)默认为0不为空;
创建函数帐户\u余额(id整数)
将余额返回为$$
挑选
作为租金的总和(如果t.amount>0,则t.amount否则为0结束),
费用总额(如果t.amount<0,则t.amount否则0结束)
来自交易t
其中t.account_id=$1
$$语言“sql”;
创建函数租户余额(id整数)
将余额返回为$$
挑选
作为租金的总和(如果t.amount>0,则t.amount否则为0结束),
费用总额(如果t.amount<0,则t.amount否则0结束)
来自交易t
其中t.tenant_id=$1
$$语言“sql”;
在我的ActiveRecord模型(在本例中为Account和Tenant)中,我如何与此关联,以便调用类似于Account.first.balance的东西,并返回一个有效的balance实例?
说到平衡,我应该如何创建此模型?我建议您查看DockYard的postgres_ext gem,它将使您能够从ActiveRecord中很好地使用CTE。
CREATE TABLE balances (rents decimal(12,2) DEFAULT 0 NOT NULL,
expenses decimal(12,2) DEFAULT 0 NOT NULL);
CREATE FUNCTION account_balance(id integer)
RETURNS balances AS $$
SELECT
SUM(CASE WHEN t.amount > 0 THEN t.amount ELSE 0 END) as rents,
SUM(CASE WHEN t.amount < 0 THEN t.amount ELSE 0 END) as expenses
FROM transactions t
WHERE t.account_id = $1
$$ language 'sql';
CREATE FUNCTION tenant_balance(id integer)
RETURNS balances AS $$
SELECT
SUM(CASE WHEN t.amount > 0 THEN t.amount ELSE 0 END) as rents,
SUM(CASE WHEN t.amount < 0 THEN t.amount ELSE 0 END) as expenses
FROM transactions t
WHERE t.tenant_id = $1
$$ language 'sql';