db:fixtures:loadを使えばseed-fuなどを使った場合に起きるseedデータとテストデータの二度書きの手間無くなります。

しかし、paperclipで画像を保存してる時など、fixturesからは読み込めないものを保存している場合に対応できません。

僕は下記のようにして解決しています。

rakeタスクを書く

db:image:loadという画像をアップするtaskを書く。

# lib/tasks/fixtures.rake:

namespace :db do
  namespace :images do
    desc "Upload images."
    task load: :"db:fixtures:load" do
      User.all.each do |user|
        path = Rails.root.join("test", "fixtures", "files", "users", "avatars", "#{user.name}.jpg")
        user.update!(avatar: open(path)) if File.exist?(path)
      end
    end
  end
end

db:fixtures:loadの後に実行する

# lib/tasks/fixtures.rake:

...

Rake::Task["db:fixtures:load"].enhance do
  Rake::Task["db:images:load"].execute
end

これでrails db:fixtures:loadすればその後で画像も入ります。

Comments


(Option)