ActiveRecordでJSON型のカラムを読み書きする時用のメモ
環境
- MySQL 5.7
- rails 5.1.3
コード
scheme.rb
create_table "foo_models", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
t.json "hoge"
end
- create
FooModel.create(
hoge: {
name: 'yamada',
age: 22,
sex: 0
}
)
- get
foo = FooModel.first
foo.hoge['name']
=> "yamada"
※取得の際にシンボル指定(foo.hoge[:name]
)だとダメなようです
ransackの検索に対応する
公式Wikiのここの対応でいけるかと思ったけどうまく動かなかったので追記でメモしておきます。
JSON型といっても中身は文字列なのでLIKE検索で力強く取得します。
foo_model.rb
ransacker :hoge_name, formatter: -> v { "\"name\": \"#{v}\"" } { Arel.sql('hoge') }
これで
FooModel.ransack(hoge_name_cont: 'yamada').result
このように検索できるようになります。