Kib*_*gon 18 ruby ruby-on-rails ruby-on-rails-3
我的rails应用程序有一个网站爬虫,可以加载爬虫在rails初始化程序中使用的身份验证凭据config/initializers.初始化程序通过调用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
Run Code Online (Sandbox Code Playgroud)
lou*_*uio 18
它可能不是更好的解决方案,但您可以检查表是否存在:
if ActiveRecord::Base.connection.tables.include?('your_table_name')
# your code goes here
end
Run Code Online (Sandbox Code Playgroud)
但它通常还不够,因为可能有未决的迁移.
现在,您还可以检查您是否在执行rake任务:
if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake)
# your code goes here
end
Run Code Online (Sandbox Code Playgroud)
并且在启动测试时仍然不够,因为在rake任务中执行,因此您还可以检查Rails环境是否为test(Rails.env.test?).
Gui*_*ick 10
我有一个类似的问题,我需要跳过一个特定的初始化程序(对于延迟作业,这需要一个delayed_job表存在),在运行特定的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
Run Code Online (Sandbox Code Playgroud)
然后在我有问题的初始化器中的以下内容:
unless defined?(is_running_migration?) && is_running_migration?
... do whatever
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5142 次 |
| 最近记录: |