特定のRakeタスク内でのみ使うメソッドの定義方法


Rails内で使うRakeタスクに以下のようなものを使おうとしました。

[code]

    namespace :task1 do
      task :do_something => :environment do
        foo
      end
      def foo
        p "task1"
      end
    end
    
    namespace :task2 do
      task :do_something => :environment do
        foo
      end
      def foo
        p "task2"
      end
    end
    
[/code]

`namespace`で区切られているため`foo`メソッドは別のものとして解釈されると思っていたのですがオーバーライドされてしまいました。

特定のRakeタスク内からしか呼び出さないメソッドのスコープを限定するにはどうすればよいのでしょうか？

特に決まった方法がないのであれば`task1_foo`などのような命名規則を適用させようと考えています。




2011年の記事ですが、こちらに同じような質問が出てますね。

<https://stackoverflow.com/questions/6172292/scope-of-rakes-in-a-rails-
project>

基本的にこの問題を回避する方法はなく、設計で回避するように、みたいなことが書かれています。

rakeタスクはcontrollerのように薄く保ち、ライブラリのメソッドを呼び出すだけの設計にするのが良い、ということみたいです。




rakeファイル内に定義したメソッドはトップレベルコンテキスト（=selfがmainオブジェクト）で定義されます。

ちょっと格好悪いですが、以下のようにmoduleで包んでincludeしてやれば、当該rakeからしか呼び出せなくなります。

[code]

    namespace :task1 do
      task :do_something => :environment do
        include Task1
        foo
      end
    end
    
    module Task1
      def foo
        p "task1"
      end
    end
    
[/code]

その他にも、外部ファイルにメソッドを定義してrequireするなど、やりようはあると思います。少なくとも、プロダクトコードと関係のないメソッドをモデル側に定義するのは、よろしくないと思います。

