我有一个postgres数据库,每行代表一个“索引”(只是一个名称不是关键字)。对于每个市场,都有一个属性“stats”,它是一个二维数组,我从外部源放入数据库。
create_table "indices", force: true do |t|
t.string "name", null: false
t.float "returns", default: [], array: true
t.float "navs", default: [], array: true
t.float "stats", default: [], array: true
t.string "updated_at"
t.string "created_at"
t.integer "idx_type_id"
end
我的问题是如何从数据库中获取统计信息值并进入我的rails程序?
在控制台中,我尝试了以下代码:
a = Index.find(1)
a.name
a.stats
它正确获取了name属性,但是我得到了stats属性的以下错误
undefined method `to_f' for ["0.259854651130407", "0.261425018884344"]:Array
方括号内显示的数字是2D数组第一行的值。有什么想法吗?
编辑:我正在运行rails 4.0.1,这是创建表的原始迁移。这里有什么语法错误吗?
class CreateIndices < ActiveRecord::Migration
def change
create_table :indices, {:id => false} do |t|
t.string :name
t.float :returns, array: true, default: []
t.float :navs, array: true, default: []
t.float :sharpe
t.timestamps
end
execute "ALTER TABLE indices ADD PRIMARY KEY (name);"
end
end
编辑2:这是psql中以下查询的输出
查询:
select stats from indices where id < 3
输出:
stats
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------
{{0.259854651130407,0.261425018884344},{0.114409534648231,0.113829156756227},{2.27126744225792,2.28284789710692},{0.0562802038101342,0.0561701509132937},{4.61715902819129,4.65416265816855},{0.0
92128059492271,0.0921734852013666},{2.82058096699852,2.81919090465893},{0.0292770008925915,0.0291771074372238},{8.87572644765545,8.95993612275702}}
{{0.259854651130407,0.261425018884344},{0.114409534648231,0.113829156756227},{2.27126744225792,2.28284789710692},{0.0562802038101342,0.0561701509132937},{4.61715902819129,4.65416265816855},{0.0
92128059492271,0.0921734852013666},{2.82058096699852,2.81919090465893},{0.0292770008925915,0.0291771074372238},{8.87572644765545,8.95993612275702}}
(2 rows)
答案 0 :(得分:-1)
float类型的列不能存储数组,它只能存储浮点数。
您可以通过text
将列类型serialize
和serialize :stats, Array
列为模型中的列,也可以通过add column :indices, :stats, :text, :array => true
创建表格。
但是在你当前的状态中,你告诉数据库列是float
类型,而不是数组,因此ORM在读/写时会对数据进行处理。