2015-01-02 2 views
3

У меня есть инициализатор, который хочет получить переменную из базы данных. Эта инициализация необходима только при запуске приложения с rails server или в процессе производства, поскольку она используется только в представлениях.Как написать инициализатор, чтобы он запускался только при правильной настройке базы данных?

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

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) 

должен сделать трюк :-)

Ref: https://www.ruby-forum.com/topic/171753

+0

AFAIK, 'defined? (Spree :: Country)' будет возвращать значение "true-ish", если константа определена независимо от того, существует или нет таблица. – berkes

 Смежные вопросы

  • Нет связанных вопросов^_^