【问题标题】:How do I skip loading of Rails initializers when running a rake task?运行 rake 任务时如何跳过 Rails 初始化程序的加载?
【发布时间】:2015-05-12 00:55:14
【问题描述】:

我的 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

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

    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环境是否是测试(Rails.env.test?)。

    【讨论】:

      【解决方案2】:

      在运行特定的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 2010-10-20
        • 2012-05-30
        • 2015-08-15
        相关资源
        最近更新 更多