2013-06-11 3 views
3

Я использую hstore с Postgres 9.2 и Rails 3.2, чтобы сохранить свой объект, как это:Преобразование строкового массива обратно в массив

class User 
    user_hstore = {:user_id =>"123", :user_courses => [1,2,3]} 
end 

Теперь, когда я получить user_courses, я получаю строку, как это: '[1, 2, 3]'

Как преобразовать эту строку в массив Rails? Еще лучше, есть ли способ хранения массива в объекте hstore, чтобы Rails автоматически извлекал его как тип массива?

+0

Несмотря на мой более ранний ответ, Postgres не поддерживает ничего за строковыми значениями. Я подозреваю, что это связано с перекрытием между функциями serialize и hstore, для этого нет готового решения. –

+1

Команда работает над улучшением этого для PostgreSQL 9.4, который, мы надеемся, будет полностью индексируемой, вложенной json-совместимой заменой для hstore. См. Http://lwn.net/Articles/553256 (в настоящее время только подписчик, будет доступен для чтения на следующей неделе). –

+0

Привет Крейг: спасибо за информацию. Глупый вопрос: Rails должен поддерживать эту функцию, прежде чем мы сможем ее использовать, правильно? – AdamNYC

ответ

1

Чтобы преобразовать его в массив:

user_courses.gsub('[', '').gsub(']', '').split(",") 

Для поиска проще, вы можете сохранить его в виде строки, делая

user_hstore = {:user_id =>"123", :user_courses => '1,2,3'} 
1

Просто бросить еще одну шляпу в кольцо, это выполняет так же, как ответ Вимши, но немного более короткий и сладкий вы можете сделать:

"[1,2,3,4]"[1..-2].split(",") 

который в вашем случае может быть:

user_courses[1..-2].split(",") 

Edit: Если скорость является проблемой я сделал быстрый тест, который можно найти here. Выполнение только нескольких предметов - это не очень большая разница, но 10 000 предметов + вы можете начать видеть разницу. Это составляет 100 000 наименований:

# "[1,2,3,4]"[1..-2].split(",") 
    0.110000 0.000000 0.110000 ( 0.114739) 

    # "[1,2,3,4]".gsub("[", "").gsub("", "]").split(",") 
    1.080000 0.000000 1.080000 ( 1.081227) 
6

Почему бы не просто использовать eval?

eval('[1, 2, 3]') 
#=> [1, 2, 3] 

Очевидно, что не делают этого на произвольных или введенные пользователем данные, но на массив целых чисел, как вы отображается, это совершенно безопасно.

7
JSON.parse "[\"1018\", \"1037\", \"1045\", \"1042\"]" 
#=> ["1018", " 1037", " 1045", " 1042"] 
Смежные вопросы