2013-03-29 2 views
0

동적으로 모델을 만들려면 다음 레일 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 

디버깅 프로그램을하지만, @@children 모든 페이지로드에 리셋되어, 따라서 아주, 아주 천천히 모든 페이지에 올려 놓습니다. 어떻게 이것을 막을 수 있습니까? 그리고 그 원인은 무엇입니까? 내가 어린이를 암기하지 않으면 Rails는 무한 루프에 빠지게된다. 레일스는 새로운 모델을 만들 때마다 최소한 몇 가지 클래스를 새로 고친다고 믿는다. 이 동작을 어떻게 막을 수 있습니까?

답변

1

레일즈는 개발 모드에서 코드를 다시로드하므로 변경 될 때마다 레일즈 서버를 다시 시작할 필요가 없습니다 (레일스 3.2에서는 변경된 코드 만 다시로드하려고 시도합니다).

클래스가 다시로드되면 레일즈가 상수를 설정 해제하고 새로운 복사본을로드하므로 특히 새로운 클래스 변수가 생깁니다.

ActiveSupport::Dependencies.autoload_once_pathsActiveSupport::Dependencies.autoload_paths이 방식으로 다시로드되는 내용을 제어합니다. 파일에 (전체) 경로를 추가하여 autoload_once_paths에 하나의 파일이 다시로드되지 않도록해야합니다 (그러나 레일스를 다시 시작해야 변경 사항을 볼 수 있습니다).

+0

왜 다시로드합니까? 각 페이지로드? 이 동작을 트리거하는'ActiveRecord :: Base'에 뭔가가 있습니까? –

+0

<레일스 3.2를 사용하고 있다면 그것이 작동하는 것입니다. 3.2 레일을 사용하고 있다면 ActiveSupport가 다시로드해야 할 항목을 결정하기 위해 사용하는 경험적 방법을 트립합니다. –

관련 문제