シード用のレーキタスクをセットアップする方法
-
10-10-2019 - |
質問
(これは本当に一般的なRake&Rails&依存関係についての初心者の質問です。これがどのようにぴったりと私の頭を包み込もうとしています)
基本的に、Seed.RBのように機能するが別々に呼ばれるレーキタスクが必要です。開発環境のテストデータを追加しますが、私のSeed.RBはすべての環境に基本的なデータを提供します。
スクリプトfamily_seed.rbは、Factorygirlを使用していくつかのレコードを生成します。このように見えます:
require File.expand_path('../../config/environment', __FILE__)
require './spec/factories'
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
で正常に動作します bundle exec "ruby db/family_seeds.rb"
, 、しかし、私の質問は、Rakeでそれをセットアップする方法です。すべてをレーキタスク内に配置する必要がありますか?代わりに、Rails開発環境が実行されたときに利用可能であることを保証しながら、スクリプトを呼び出すタスクをどのように設定できますか?私は仕事を成し遂げようとするだけでなく、「正しい」方法でそれをするようにしています。
解決
これにアプローチする1つの方法は、libでクラスまたはモジュールを作成することです(これにより、テストを簡単に記述し、コードをより再利用可能にします):
require '../spec/factories'
class FamilySeed
def self.seed
raise "Don't run this in production!" if Rails.env.production?
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
end
end
レーキタスクの作成方法:
require 'family_seed'
namespace :seed do
task :families => :environment do
FamilySeed.seed
end
end
family.delete_allやmember.delete_allのようなものを自由に使用しすぎるようにすることに注意してください。プロダクションDBで意味しないものを呼び出すことで、後で簡単に足を撃つことができます。
レーキタスクの実行方法:
次のようにあなたのコマンドでそれを実行します:
bundle exec rake seed:families
他のヒント
レーキタスクを作成し、環境を必要とします
task :delete_all => :environement do
require Rails.root.join('spec/factories')
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
end
このタスクを実行できた後 rake delete_all
所属していません StackOverflow