【问题标题】:rails postgres read array out of dbrails postgres 从数据库中读取数组
【发布时间】:2013-12-18 20:59:00
【问题描述】:

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

我的问题是如何将 stats 值从 db 中取出并输入到我的 rails 程序中?

在控制台中,我尝试了以下代码:

a = Index.find(1)
a.name
a.stats

它正确获取了 name 属性,但我得到了 stats 属性的以下错误

 undefined method `to_f' for ["0.259854651130407", "0.261425018884344"]:Array

方括号内的数字是二维数组第一行的值。有什么想法吗?

编辑:我正在运行 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)

【问题讨论】:

  • 这是什么版本的 Rails?
  • 我正在运行 rails 4.0.1
  • psql中使用\d indices检查数据库中的表定义。
  • 在表定义中,它的类型为双精度[],修饰符为默认的'{}'::双精度[]。当我有一个二维数组时,它被声明为一维数组也很重要,在 PG 文档中它似乎暗示它没有,因为它实际上并没有强制数组的维度或长度。
  • 所以整个数组看起来更像[[0.25, 0.26]]而不是[0.25, 0.26]?也许包括来自psql 的一些select stats from indices 数据将有助于澄清事情。我目前的猜测是 Rails4 只理解一维数组。

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


【解决方案1】:

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

您可以通过serialize :stats, Array 将列类型text 然后serialize 设置为模型中的列,或者您可以通过add column :indices, :stats, :text, :array =&gt; true 创建表。

但是在您当前的状态下,您已经告诉数据库该列是 float 类型,而不是数组,因此 ORM 在读取/写入时会这样处理数据。

【讨论】:

  • 好吧,为了清楚起见,你的意思是 rails 只支持字符串类型的数组而不支持其他数据类型?
  • 不,我的意思是你告诉 rails 你的表的模式是一个浮点字段,而它实际上是一个数组字段,所以这就是为什么 activerecord 试图将它视为一个浮点数。
  • 我明白了,但是从您建议的解决方案来看,我似乎无法将该字段声明为浮点数组。我必须将其声明为文本数组,然后稍后将其从文本转换为浮点数。对吗?
  • 我相信您可以声明为:integer, :array =&gt; true:decimal, :array =&gt; true 或任何字段类型。此外,您可以自己将其序列化为任何类型的数组。序列化字段默认使用文本列,这就是我的示例采用这种方式的原因
  • ps,在这个案例中,谷歌也是你的朋友
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多