Techioz Blog

Rails select_all deserialize Postgresql 配列

概要

配列値 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 で結果を解析し、代わりにネストされた配列を返すようにするにはどうすればよいですか?

解決策

あなた (私) は、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