2013-03-29 2 views
0

Я использую следующие действия Rails 3 модели динамически создавать модели:Есть ли безопасное место для хранения динамически созданных моделей Rails?

# encoding: UTF-8 

require_dependency 'read_only' 
require_dependency 'readings_methods' 

class Reading < ActiveRecord::Base 
    self.abstract_class = true 

    include ReadOnly 
    include ReadingsMethods 

    @@mutex = Mutex.new 
    @@children = {} 

    def self.with_table(t) 
    @@mutex.synchronize do 
     child = @@children[t] 
     if child.nil? 
     child = Class.new(self) do 
      self.table_name = t 
     end 
     @@children[t] = child 
     end 

     child 
    end 
    end 
end 

Debugging показывает, однако, что @@children сбрасывается при каждой загрузке страницы, что делает каждую загрузку страницы очень, очень медленно. Как я могу это предотвратить? И что вызывает это? Если я не помню детей, Rails переходит в бесконечный цикл, что заставляет меня поверить, что он перезагружает по крайней мере некоторые классы всякий раз, когда я создаю новую модель или что-то в этом роде. Как предотвратить такое поведение?

ответ

1

Rails перезагружает код для вас в режиме разработки, так что вам не нужно перезапускать сервер рельсов каждый раз, когда вы вносите изменения (в рельсах 3.2 он пытается только перезагрузить измененный код).

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

ActiveSupport::Dependencies.autoload_once_paths и ActiveSupport::Dependencies.autoload_paths контроль над тем, что перезагружается таким образом. Вы должны иметь возможность добавить (полный) путь к вашему файлу в autoload_once_paths, чтобы предотвратить перезагрузку одного файла (но вам придется перезапустить рельсы, чтобы увидеть внесенные в него изменения)

+0

Но почему это перезагружается на каждая загрузка страницы? Что-то в 'ActiveRecord :: Base' запускает это поведение? –

+0

Если вы используете

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