RailsでCarrierWaveを使っているモデルのデータを投入・出力する方法
こんにちは,miです.
今回はRailsでCarrierWave
を使っている方にお勧めなgemika
を紹介します.
ika
とは
ika
はRailsのgemで,モデルオブジェクトを,jsonでインポート / エクスポートするものです.
特徴としては,
- 関連するモデルの情報も指定して取れる
- CarrierWaveで扱っているファイルも一緒にエクスポート / インポートされる
ということがあります.
特に2つ目の,ファイルも一緒にというのがポイントです.
どういう時に役に立つのか
以下の様な場合に使っています.
- ビュー以外からのデータの登録(APIを実装してそこから受け取ったデータを登録するとか)
- 他の環境からデータをダンプして持ってきたい
- データを複製したい
どんな感じで使うのか
詳しくはika
のREADMEをご覧頂きたいんですが,
https://github.com/Aqutras/ika
例えばこのようにイメージを持つモデルがあって,
class User < ActiveRecord::Base mount_uploader :image, ImageUploader end
これをエクスポートすると,
JSON.parse User.export => [{"id"=>1, "name"=>"user_name", "file"=> {"url"=> "/hogehoge/image.jpg", "name"=>"image.jpg", "data"=> "data:image/jpeg;base64,...", "md5"=>"0f860fd8dad7b2e60c7b6ed59b89a429"}, "created_at"=>"2015-12-12T01:22:48.000+09:00", "updated_at"=>"2015-12-12T01:22:48.000+09:00"},... ]
このようなデータが出力されます.
ファイルはbase64に変換されて,一緒に出力されるという仕組みです.
インポートしたいときは,
# export_data = User.export User.import(export_data)
とすればOKです.
インポート時に同じIDが存在した場合は上書き,存在しない場合は新規追加されるようになっています.
その他にもinclude
オプションで関連するモデルを一緒に取ってくる事もできます.
データを複製したい時は,exportしたデータからid
を除いた後にimportすることで行えますが,CarrierWave
を使っていないモデルに関しては,deep_cloneable
というgemを使う方が機能が充実してていいです.
github.com
CarrierWave
を使っているモデルはika
で,それ以外はdeep_cloneable
で,というのがお勧めの方法です.
またオプションとしてsync modeがあって,
User.import(User.where(id: 1).export, sync: true)
とすると,
data = User.where(id: 1).export User.destroy_all User.import(data)
と同じ結果になります.
最後に
GitHubアイコンでお気づきかもしれませんが,ika
は弊社で開発しております.
バグがあった,こんな機能が欲しいなどありましたら,issueにお書きください.
もちろんPullRequestもお待ちしております!