Ruby on rails 在运行rake任务时,如何跳过Rails初始值设定项的加载?

Ruby on rails 在运行rake任务时,如何跳过Rails初始值设定项的加载?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我的rails应用程序有一个网站爬虫程序,它加载爬虫程序在config/initializers中的rails初始值设定项中使用的身份验证凭据。初始值设定项通过调用SiteLogin模型中的模型方法来加载身份验证 当我运行rake db:migrate创建SiteLogin模型表时,它会失败,因为初始值设定项希望数据库表已经存在。我可以简单地注释掉初始值设定项中的代码,运行迁移以创建表,然后取消对初始值设定项代码的注释,而不必担心问题 问题是,我正在使用Capistrano进行部署,这意味着我必

我的rails应用程序有一个网站爬虫程序,它加载爬虫程序在
config/initializers
中的rails初始值设定项中使用的身份验证凭据。初始值设定项通过调用SiteLogin模型中的模型方法来加载身份验证

当我运行
rake db:migrate
创建
SiteLogin
模型表时,它会失败,因为初始值设定项希望数据库表已经存在。我可以简单地注释掉初始值设定项中的代码,运行迁移以创建表,然后取消对初始值设定项代码的注释,而不必担心问题

问题是,我正在使用Capistrano进行部署,这意味着我必须先在没有初始值设定项代码的情况下进行部署才能运行迁移,然后再使用初始值设定项代码进行部署。在这种情况下,是否有更好的方法,或者我的方法完全错误

下面是一些代码示例,可以更好地解释我的案例:

# config/initializers/site_crawler_init.rb
SiteCrawler.setup do |config|
  config.hostname = "www.example.com"
end

# model/site_crawler.rb
class SiteCrawler
  ...
  class << self
    attr_accessor :configuration

    def setup
      self.configuration ||= Configuration.new
      yield(configuration)
    end
  end

  class Configuration

    attr_accessor :hostname, :login_credentials

    def initialize
      @login_credentials = SiteLogin.admin_user
      ...
    end
  end
end
#config/initializers/site_crawler_init.rb
SiteCrawler.setup do | config|
config.hostname=“www.example.com”
结束
#型号/站点\u crawler.rb
类站点爬虫
...

class这可能不是更好的解决方案,但您可以检查表是否存在:

if ActiveRecord::Base.connection.tables.include?('your_table_name')
  # your code goes here
end
但这通常是不够的,因为可能存在挂起的迁移

现在,您还可以检查您是否正在执行rake任务:

if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake)
  # your code goes here
end

在启动测试时,这可能还不够,因为在rake任务中执行了一些任务,因此您还可以检查Rails环境是否为test(
Rails.env.test?
)。

我遇到了一个类似的问题,我需要跳过一个特定的初始值设定项(对于延迟的作业,它需要存在一个延迟的作业表),在运行特定的rake任务时-在本例中为db:migrate

我在Rakefile中添加了以下内容:

def running_tasks
  @running_tasks ||= Rake.application.top_level_tasks
end

def is_running_migration?
  running_tasks.include?("db:migrate")
end
然后在我有问题的初始化器中执行以下操作:

unless defined?(is_running_migration?) && is_running_migration?
  ... do whatever
end