rails postgres从db中读出数组

时间:2013-12-18 20:59:01

标签: ruby-on-rails arrays postgresql ruby-on-rails-4

我有一个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)

1 个答案:

答案 0 :(得分:-1)

float类型的列不能存储数组,它只能存储浮点数。

您可以通过text将列类型serializeserialize :stats, Array列为模型中的列,也可以通过add column :indices, :stats, :text, :array => true创建表格。

但是在你当前的状态中,你告诉数据库列是float类型,而不是数组,因此ORM在读/写时会对数据进行处理。