Edited at

Sinatraにseed-fuを求めるのは間違っているだろうか(Sinatraでseed-fuを使う方法)

More than 1 year has passed since last update.


seed-fuとは何か

DBに初期データを投入するための仕組みとして、Rails(ActiveRecord)にはdb:seedというrakeタスクが用意されています。

このrakeタスクには冪等性がないため、実行するたびに新たなレコードが登録されます。そのため、変更が想定されるデータにおいてはdb:seedで投入する際に工夫が必要となります。

その煩雑さを解決する手段として登場するのが、seed-fuです。seed-fuでは更新されたレコードのみを操作します。つまり、値が変わったレコードはUPDATEされ、追加されたレコードはINSERTされます。


Sinatraで使う方法

この便利なseed-fuですが、Sinatraとの組み合わせで使う場合にひと手間必要となります。

Rails上での使用が前提とされているため、Sinatraにおいては自前でrakeタスクを定義する必要があります。

以下のRakefileをルートディレクトリに配置します。

require 'sinatra/activerecord'

require 'sinatra/activerecord/rake'
require 'seed-fu'

namespace :db do
task :seed_fu do
SeedFu.seed
end

task :load_config do
require './app/app' # FIXME ActiveRecordの設定を行っているファイルを指定します。環境に合わせてパスを修正してください。
end
end

Rake::Task['db:seed_fu'].enhance(['db:load_config'])

これによりrake db:seed_fuを実行できるようになります。


参考リンク

mbleigh/seed-fu - GitHub

sinatra-activerecord で seed_fu を使ってみた