Rails select_all десериализует массив Postgresql

#ruby-on-rails #ruby #postgresql #activerecord

Вопрос:

Я делаю пользовательский запрос, который возвращает строки со значением массива term_names

 Product.connection.select_all("
  SELECT ARRAY_AGG(terms.name), vocabularies.name vocabulary_name
  FROM terms
  INNER JOIN vocabularies ON vocabularies.id = terms.vocabulary_id
  GROUP BY vocabulary_name")

| term_names                                                     | vocabulary_name |
|----------------------------------------------------------------|-----------------|
| {{76,Yellow},{77,Green},{79,Blue}.                             | Color           |
 

Но проблема в том, что Rails не хочет преобразовывать {…} в массив ruby и возвращает его в виде строки.

 [{"array_agg"=>"{Yellow,Green,Blue}", "vocabulary_name"=>"Color"}]
 

Как я могу заставить Rails анализировать результат и вместо этого возвращать вложенный массив?

Комментарии:

1. какая у вас версия Rails?

2. Вы в значительной степени неправильно используете ruby … Но в любом случае вы просите свою базу данных вернуть строку. Если вы хотите, чтобы это был массив , вам нужно будет использовать split и/или настроить модель для работы с таблицей «термины», а затем использовать ruby для группировки

3. @JoelBlum его рельсы 6

Ответ №1:

Вы (я) должны вызвать метод cast_values

 Product.connection.select_all("
  SELECT ARRAY_AGG(terms.name), vocabularies.name vocabulary_name
  FROM terms
  INNER JOIN vocabularies ON vocabularies.id = terms.vocabulary_id
  GROUP BY vocabulary_name").cast_values