如何让列自动计算?导轨

Posted

技术标签:

【中文标题】如何让列自动计算?导轨【英文标题】:How can I have a column autocalculate itself? Rails 【发布时间】:2013-03-28 03:03:14 【问题描述】:

我的表格中有每日股票价格,并且我添加了一个我想自动计算的列。我不希望它是手动计算,因为股票价格是我通过金融 api 导入模型的东西。

因此我只是使用ActiveRecord-import,然后自动填充该列。

有问题的列是百分比变化和过去 5 天的平均值。我觉得这是我可以在数据库端设置的东西,以便自动填充这些列。几乎就像 Excel 能够只写 =a1/b1 然后填充整个表格。

这在 Rails 模型或 postgresql 中是否可行? (使用 rails 3.2 和 postgresql 9.2)

【问题讨论】:

【参考方案1】:

还有一个更接近您的想法的选项:“计算字段”“生成的列”。实际上是一个以行类型为参数的函数。我引用the manual here:

函数记法和属性记法的等价性 可以在复合类型上使用函数来模拟“计算字段”

您的示例可能如下所示:

CREATE TABLE tbl (a_id int, a int, b int);
INSERT INTO tbl VALUES (1,3,7), (2,4,8), (3,9,2);

模拟计算域calc的函数:

CREATE OR REPLACE FUNCTION calc(tbl)
  RETURNS numeric LANGUAGE sql IMMUTABLE  AS
$func$
    SELECT round($1.a::numeric/$1.b, 2)
$func$;

呼叫:

SELECT *, t.calc FROM tbl t;  -- note the table-qualified call!

返回:

 a_id | a | b | calc
------+---+---+------
    1 | 3 | 7 | 0.43
    2 | 4 | 8 | 0.50
    3 | 9 | 2 | 4.50

更多详细信息和解释的相关答案:Computed / calculated columns in PostgreSQLHow do you do date math that ignores the year?Store common query as column?

【讨论】:

我注意到你写了一个关于表的函数。每当我使用select t.calc 时都会执行该功能吗?还是该函数已经执行并且现在正在存储一个值?我问是因为性能原因。如果每次我使用select *,t.calc 时它都会运行该函数,那么我最好使用触发器并第一次将值插入列中,从而节省我随后每次处理计算所需的时间。你知道它是在select上存储值还是计算? @ErwinBrandstter 我还有另一个问题...您的公式能够计算每一行,我将如何计算多行?例如,在您的表格中,我需要一些东西来显示 b 列中的增加/减少。 'calc' 列将是 7/8-1 = -.125 或 8/2-1 = 3。这些是我在 calc 列中需要的值,第三列显示为 nil。 @Chowza:我会用窗口函数lag() 解决这个问题,就像今天演示的in this related answer:底部的“正确解决方案”段落。【参考方案2】:

我知道DB 端有 2 个选项,您可以尝试使用 view,其中包含获取动态字段的逻辑,或者您可以使用 trigger 在任何位置自动填充它们表变化

更新: *触发器* 只不过是当您对表执行任何更新(插入/更新/删除)时自动触发的函数,这里有更多信息:http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html

Views 是给定 sql 查询的伪名称,您可以将逻辑编写为

create view test as select 1+1 as dynamic_col

然后将其用作

select * from test;

在上述情况下输出应为2,但可以根据您的要求自定义视图

这里有更多信息:http://www.postgresql.org/docs/9.2/static/sql-createview.html

【讨论】:

我还是个使用数据库的新手。触发器是我在 Rails 迁移中设置的吗?我有 pgadmin 3,我可以查看文档以了解如何编写该语句,但是当我将应用程序推送到我们的开发基地时,我的朋友在他的计算机上是否能够看到我的 postgresql 更改? rails 中记录的数据库代码在哪里?或者这是我在 ACtiveRecord::Base.connection 中写的东西

以上是关于如何让列自动计算?导轨的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个每行列数未知的 html 表,让列对齐,并为每个单元格/行设置一个 id?

一个人如何确保它们在一台机器上的导轨环境与另一台机器相同?

如何使用序列号自动填充列,但基于参数?

如何降级捆绑器或升级导轨?

如何选择 f.select 导轨

导轨 3.1。如何防止 Rails 使用 CoffeeScript?