初心者プログラマのひとり勉強部屋

若葉マークのプログラマー☺️

【ruby on rails】rakeタスクの作成

こんにちは!

 

今回はrakeタスクの作成について備忘録します。

DB作成する際、

$rake db:create

など打ちます。こちらがrakeタスクに登録されているので使えることになります。

 

 ・今あるrakeタスクの確認方法

$rake -T

---------------略

rake db:create                          # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to c...

rake db:drop                            # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop ...

rake db:environment:set                 # Set the environment value for the database

rake db:fixtures:load                   # Loads fixtures into the current environment's database

rake db:migrate                         # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)

rake db:migrate:status                  # Display status of migrations

----------------など略

(左側:コマンド  右側:#説明)になります。

 

今回は、

rake db:seed                            # Loads the seed data from db/seeds.rb

seedファイルを分割して実行するrakeタスクを作成しました。

(フリマサイトの1200このカテゴリーデータを作成するため)

本題は下の方

 

作成には、こちらのサイトさまを参考にさせていただきました!

https://qiita.com/suzuki-koya/items/787b5562d2ae1a215d94

 

■まずテスト実行でつくってみた

①rakeタスクファイルの作成

$rake g task moco($rake g task 【タスク名】)

create  lib/tasks/moco.rake  (この場所に書かないとタスク登録されません!)

 

lib/tasks/moco.rake(初期設定)

namespace :moco do //※namespace:タスクの名前
end
 
②rakeファイルの編集
lib/tasks/moco.rake
namespace :moco do
 desc "テストタスクの設定" //タスクの説明
 task :hello do //タスクのコマンド(以下は実行内容)
  puts "こんにちは!" //rubyコマンドが使えます
 end
end

 

③確認

・ターミナル 

$rake -T

-----------

rake moco:hello                        # テストタスクの設定 →増えた!

-----------
※rake [namespace名]:[task名] で実行できます。
 
④実行
$ rake moco:hello
 
⑤結果
こんにちは!

 

■テスト実行でつくってみた2(引数あり)

アプリケーションのrake routeの内容が膨大なので、キーワードを含むルーティングだけ表示させるようにします。

namespace :moco do
 desc "テスト2(rake routes)"
 task :r3, [:o] do |_,args| //引数の設定
  sh "rake routes |grep #{args.o}" /引数の使用
 end
end

 ・ターミナル

$rake -T

-----------

rake moco:r3[o]                         # テスト2(rake routes)

----------- 

 

 ・実行

$ rake moco:r3[user] ←引数[o]にuserを入れた(rake routesからユーザ関連のrouteを抜き出す

 

・結果

----------------

rake routes |grep user

                     new_user_session GET      /users/sign_in(.:format)                                                                 devise/sessions#new

                         user_session POST     /users/sign_in(.:format)                                                                 devise/sessions#create

                 destroy_user_session DELETE   /users/sign_out(.:format)                                                                devise/sessions#destroy

 ----------------略

→user関連のルーティングだけ出てきた!

 

・参考

 https://qiita.com/mosson/items/9a9b0703ac4c76ebfd4e

引数を渡す

https://easyramble.com/ways-for-rake-tasks.html

 

 

           ■本題

1200程度のカテゴリデータを分割したseedファイルに記載したので、rakeタスクファイルを作成して投入します

→db/seeds/category.rb 作成済み・カテゴリー投入データ記載済み

(通常のdb/seeds.rbに記載しただけならrake db:seedで投入できます)

 

・rakeタスクファイル作成

$rake g task task_seed

 

・タスク編集

 lib/tasks/task_seed.rake

namespace :task_seed do
 Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')).each do |file| //※Dir.globでパス(db/seeds/*.rb)にマッチするファイルを探し出す
  desc "Load the seed data from db/seeds/#{File.basename(file)}." //※basename:パス名からディレクトリ部分を除き、ファイル名だけを抜き取る
  task "db:seed:#{File.basename(file).gsub(/\..+$/, '')}" => :environment do
   //※gsub:paternにマッチする文字列をreplace(置き換える)・ここでは拡張子を取っている
   //※:environment do:DBなどに接続するときは必要
   load(file)
  end
 end
end

 

・rakeタスク確認

rake task_seed:db:seed:category         # Load the seed data from db/seeds/category.rb

 

・rakeタスク実行

$rake task_seed:db:seed:category

→投入完了!

 

■余談

今回seedファイルを3つ作りました。

・db/seeds/category.rb //カテゴリ関連のDB登録データ

・db/seeds/product.rb //product関連のDB登録データ

・db/seeds/user.rb //ユーザ関連のDB登録データ

上記記載だと、自動的にファイル名を探してrakeタスクに3つとも登録されます。

$rake -T

-----------------

rake task_seed:db:seed:category         # Load the seed data from db/seeds/category.rb

rake task_seed:db:seed:product          # Load the seed data from db/seeds/product.rb

rake task_seed:db:seed:user             # Load the seed data from db/seeds/user.rb

-----------------

 

以上です。

まだまだ便利に使えそうだけど勉強中です🙇‍♀️

 

 

 参考にさせていただきました

https://qiita.com/masaki7555/items/d65f56958020cbca5ee0