我的 Rails 应用程序有一个网站爬虫,它加载爬虫在 Rails 初始化程序中使用的身份验证凭据config/initializers
。初始化程序通过调用 SiteLogin 模型中的模型方法来加载身份验证。
当我跑步时rake db:migrate
来创建SiteLogin
model table 它失败,因为初始化程序期望数据库表已经存在。我可以简单地注释掉初始化程序中的代码,运行迁移来创建表,然后取消注释初始化程序代码,而不必担心问题。
问题是,我使用 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
它可能不是更好的解决方案,但您可以检查该表是否存在:
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?
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)