2013-12-18 4 views
2

У меня есть postgres db с каждой строкой, представляющей «индекс» (просто имя не ключевое слово). Для каждого рынка существует атрибут «stats», который представляет собой двумерный массив чисел, который я помещал в db из внешнего источника.rails postgres read array out of db

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 

Моя проблема заключается в том, как получить значения статистики из базы данных и в программу моих рельсов?

В консоли, я попытался следующий код:

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

Это правильно получает имя атрибута, но я получаю следующее сообщение об ошибке для статов атрибутов

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

Числа, показанного внутри квадратные скобки - это значения первой строки двумерного массива. Есть идеи?

EDIT: Я запускаю рельсы 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 

EDIT 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

Какая версия Rails это? –

+0

i'm running rails 4.0.1 – jhlu87

+0

Проверьте определение таблицы внутри базы данных с помощью '\ d indices' из' psql'. –

ответ

-1

столбец типа поплавка не может хранить массивы , он может хранить только поплавки.

Вы можете либо сделать тип столбца text, а затем serialize columm в модели с помощью serialize :stats, Array или вы можете создать таблицу с помощью add column :indices, :stats, :text, :array => true.

Но в вашем текущем состоянии вы сообщили базе данных, что столбец является типом float, а не массивом, поэтому ОРМ обрабатывает данные как таковые, когда он читает/записывает.

+0

ok, чтобы просто быть понятным, что вы говорите: rails поддерживает только массивы типа string, а не другие типы данных? – jhlu87

+0

Нет, я говорю, что вы сказали рельсам, что схема для вашей таблицы была полем с плавающей точкой, когда это действительно поле массива, поэтому activerecord пытается рассматривать его как float. – cpjolicoeur

+0

Я вижу, но из ваших предлагаемых решений кажется, что я не могу объявить это поле массивом поплавков. Я должен объявить его как текстовый массив, а затем преобразовать из текста в float в какой-то более поздний момент. Это верно? – jhlu87