2009-07-05 2 views
1

Im работает над старой базой данных оракула с условным обозначением наименьших таблиц, где каждое имя столбца имеет префикс с начальными буквами таблиц - например, policy.poli_id.Проблемы с Rails-зависимостями в режиме производства

Чтобы упростить работу с этой базой данных, у меня есть метод set_column_prefix, который создает Accessors для каждого столбца с удаленным префиксом. то есть:

# Taken from wiki.rubyonrails.org/rails/pages/howtouselegacyschemas 
class << ActiveRecord::Base 
    def set_column_prefix(prefix) 
    column_names.each do |name| 
     next if name == primary_key 

     if name[/#{prefix}(.*)/e] 
     a = $1 

     define_method(a.to_sym) do 
      read_attribute(name) 
     end 

     define_method("#{a}=".to_sym) do |value| 
      write_attribute(name, value) 
     end 

     define_method("#{a}?".to_sym) do 
      self.send("#{name}?".to_sym) 
     end 

     end 
    end 
    end 
end 

Это в файле (insoft.rb) в моем Lib /, и требуется от моего конфига/environment.rb после блока Rails :: Initializer.run.

Это работает хорошо в развитии, но когда я пытаюсь запустить приложение в режиме производства, я получаю следующее сообщение об ошибке во всех моих моделей:

[email protected]:~/code/voyager$ RAILS_ENV=production script/server 
=> Booting Mongrel 
=> Rails 2.3.2 application starting on http://0.0.0.0:3000 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1964:in `method_missing': 
undefined method `set_column_prefix' for #<Class:0xb3fb81d8> (NoMethodError) 
    from /home/dgs/code/voyager/app/models/agent.rb:16 

Эта ошибка инициированной «конфигурации .cache_classes = true 'в config/environment/production.rb. Если я установил это на false, тогда рельсы запустится, но не будут кэшировать классы. Я предполагаю, что это приводит к тому, что рельсы кэшируют все модели до запуска блока инициализатора.

Если я перевешу 'require' insoft.rb '' до начала блока Rails :: Initializer.run, тогда я получаю ошибки, потому что ActiveRecord не был инициализирован еще:

usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant ActiveRecord (NameError) 
    from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing' 
    from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing' 
    from /home/dgs/code/voyager/lib/insoft.rb:1 

Где я должен быть в том числе и этот обычай LIB и метод set_column_prefix для того, чтобы его забрать до того, как модели кэшируются, но после того, как загружены все файлы ActiveRecord ?

Приветствия

Дэйв Е. Смайли

ответ

2

Где я должен быть в том числе и этот обычай Lib и метод set_column_prefix для того, чтобы быть подобран перед моделями кэшируются, но после того, как загрузили все ActiveRecord файлы ?

Попробуйте установить initializer. Вы можете назвать его config/initializers/insoft.rb с содержимым вашего патча обезьяны:

class << ActiveRecord::Base 
    def set_column_prefix(prefix) 
    column_names.each do |name| 
     next if name == primary_key 

     if name[/#{prefix}(.*)/e] 
     a = $1 

     define_method(a.to_sym) do 
      read_attribute(name) 
     end 

     define_method("#{a}=".to_sym) do |value| 
      write_attribute(name, value) 
     end 

     define_method("#{a}?".to_sym) do 
      self.send("#{name}?".to_sym) 
     end 

     end 
    end 
    end 
end 
+0

Спасибо, ребята. Это, похоже, устранило проблему. –

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