У меня есть столбец JSON в одной из моих моделей, который содержит массив хэшей
create_table "articles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "title"
t.json "data"
end
Когда я храню хэш Ruby внутри #data
, ActiveRecords заботится о преобразовании его в json и храненииэто в БД.
article = Article.new(data: [{ some: "data" }])
article.save
article.reload.data
=> [{ "some" => "data" }]
Но, как вы можете видеть в примере выше, когда я читаю поле обратно из БД, ключи преобразуются в строки (это очевидно, потому что он хранится в формате JSON).
Мой вопрос: обеспечивает ли ActiveRecord какую-либо встроенную функциональность для преобразования строковых ключей в символы?
Я мог бы перезаписать получательи символизируют ключи на месте, но это становится неудобным, если у вас много полей json:
def data
_data = self[:data]
_data.each.with_index do |hash, idx|
_data[idx] = hash.symbolize_keys
end
_data
end
Это становится более беспорядочным, когда вы смешиваете типы данных внутри одного массива, и вы должны позаботиться о том,хеш это или нет ...
# this would fail because String does not implement #symbolize_keys
article.data << "foo"
article.data << { bar: "test" }