如何将以前的外部ruby脚本集成到Rails应用程序中并从rake任务中调用它们?

yll*_*ate 1 ruby ruby-on-rails ruby-on-rails-3

我有一些我在Rails 3.1.x应用程序之外编写的其他脚本,但现在是时候直接从Rails应用程序的数据库中提取数据而不是利用一些数据导出.

为此,我想将脚本集成到我的rails应用程序中.到目前为止,我已经根据模型中的方法运行了rake任务,例如在我的lib/taks/app.rake:

desc "Does something."
task :do_some_things => :environment do
  ModelName.some_method
  ModelName.another_method
end
Run Code Online (Sandbox Code Playgroud)

如果我将脚本基本上放到lib中,我是否可以从rake任务中调用它们?或者我需要模型中的调用方法require lib/my_script.rb吗?

我试图写一个这样的任务:

task :run_me => :environment do
  `bundle exec lib/script.rb`
end
Run Code Online (Sandbox Code Playgroud)

然后,当这执行并且我有一个require脚本.rb(require 'lib/another_script.rb')我最终得到"无法加载此类文件"错误.

我现在显然是以错误的方式接近这个.

好像我应该在rake任务中简单地进行一个方法调用,然后调用/ lib或其他地方的支持脚本(在哪里最合适).

che*_*red 5

我处理这种事情的首选方式如下:

  • 使用一种操作方法将每个脚本完整地包装在一个模块中
  • 将包含方法包装脚本的文件放在lib /中(您可以将多个方法脚本放在一个文件中,或者将它们保存为每个文件一个
  • 在Rakefile中需要lib中的所有内容
  • 在rake任务中,包括模块并调用方法

所以,用非常简单的术语:

# lib/foo.rb
module Foo
  def bar
    puts "called me"
  end
end
Run Code Online (Sandbox Code Playgroud)

和:

# Rakefile
require File.expand_path('../config/application', __FILE__)
Dir[
  File.expand_path(Rails.root.join 'lib', '**', '*.rb')
].each {|f| require f}

desc "does bar from lib"
task :do_bar do
  include Foo
  bar
end
Run Code Online (Sandbox Code Playgroud)