Postgresql 映射到ActiveRecord模型的数据库函数

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

假设我有两个这样的数据库函数(pl/pgsql):

创建表余额(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';