Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

RailsでCarrierWaveを使っているモデルのデータを投入・出力する方法

こんにちは,miです.

今回はRailsでCarrierWaveを使っている方にお勧めなgemikaを紹介します.

ikaとは

github.com

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もお待ちしております!