2015-01-02 65 views
3

我有一个想要从数据库中获取变量的初始化程序。只有在rails server或生产环境中运行应用程序时才需要此初始化,因为它仅用于视图中。如何编写初始化程序,以便它只在数据库设置正确时才运行?

config.default_country_id = Spree::Country.find_by(name: 'Netherlands').try(:id) 

当一个空数据库(或任何rake任务)失败上运行rake db:setup,因为该值,正在获取不存在的表(db:setup试图创建它)。

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'revitalised_staging.spree_countries' doesn't exist:... 

我应该如何编写这样的初始化程序呢?除非数据库设置正确,否则我是否可以将其包装在一些通用的条件下,让我可以跳过它?我是否应该只在我知道需要它的时候运行它(例如,将几个命令或模式列入白名单?)。

回答

1

你可以问ActiveRecord的表是否存在,因此只有当它的选项。我想你可以添加某种后备,但由于该值只用于视图中,所以我不打扰。

if ActiveRecord::Base.connection.table_exists? Spree::Country.table_name 
    config.default_country_id = Spree::Country.find_by(name: 'Netherlands').try(:id) 
end 
0
config.default_country_id = Spree::Country.find_by(name: 'Netherlands').try(:id) if defined?(Spree::Country) 

应该做的伎俩:-)

编号:https://www.ruby-forum.com/topic/171753

+0

如果常量被定义,AFAIK,'defined?(Spree :: Country)'将返回一个“true-ish”值,无论该表是否存在。 – berkes

相关问题