2012-04-24 2 views
0

레일 레코드 앱 외부에서 적절한 순서로 활성 레코드 모델을로드/요구하려면 어떻게해야합니까? 많은 STI 모델이 있고 초기화되지 않은 상수 예외가 발생합니다.레일 앱 외부에서 적절한 순서로 ActiveRecord 모델로드하기

$:.push File.expand_path("../../../app/models", __FILE__) 
require "active_record" 

Dir["#{File.expand_path('../../../app/models', __FILE__)}/*.rb"].each do |path| 
    require "#{File.basename(path, '.rb')}" 
end 

은 내가 resque으로 실행하는 데 필요한 작업을 많이하고 난 오히려 내 레일 애플 리케이션로드 매번이없는 것입니다 및 작업자 기계

편집의 모든 배포 : 명확히 한 점 게다가. Rails 프로젝트와 내 모델이 포함 된 레일 엔진 프로젝트 두 가지가 있습니다. 나는 레일스 엔진 자체를 내 resque 작업으로로드하지 않는다. 나는 위에서 별도의 클래스에서 스 니펫을 사용하여 모델에 활성 레코드를로드한다. 이것은 이름 지정으로 인해 자식이 부모 앞에로드되도록 시도한 일부 STI 모델을 추가 할 때까지 항상 작용했습니다. 레일 프로젝트에서 레일 엔진 프로젝트가 제대로로드됩니다. 레일 프로젝트 외부에서 활성 레코드를 사용하려고하기 때문에 문제가 없습니다.

+0

일부 코드를 게시 하시겠습니까? 정확히 무엇을 시도 했습니까? – klump

답변

-1

내 문제가 해결되었습니다. 더 나은 방법이있을 수 있지만 이것은 나를 위해 그것을 않습니다.

basedir = File.expand_path('../../../app/models', __FILE__) 
Dir["#{basedir}/*.rb"].each do |path| 
    name = "#{File.basename(path, '.rb')}" 
    autoload name.classify.to_sym, "#{basedir}/#{name}" 
end 
+0

수정을 축하합니다! 가능한 경우 다른 사람들이 귀하의 성공을 통해 배울 수 있도록 귀하의 답변을 '수락'으로 표시하십시오. 건배 ~ –

1

모델은 첫 번째 언급에서 자동로드됩니다.

Product 
LineItem 
Cart 

을하고 도움이되는지 확인 : 그래서 단지 (config/initializers/load_order.rb에, 말) 어딘가 적절한 순서로 이름을 지정합니다.

+0

이것은 레일 앱 안에 있지 않으므로 초기화 프로그램은 나에게 많은 도움이되지 않습니다. 레일 애플 리케이션 자체가 잘 시작하고 문제없이 모델을 사용합니다. – dennis1600

+0

"Rails 앱 외부"에서 무엇을 의미합니까? 모델을 다른 곳에서 재사용합니까? – jdoe

+0

예. 내 원래 게시물에 내 설명을 참조하십시오. – dennis1600

2

자동로드를 원하지 않는다면 아주 간단한 해결책은 하위 클래스에서 기본 클래스를 요구하는 것입니다. 명시 적으로 의존성을 요구하는 것은 좋은 일입니다. :)

응용 프로그램/모델/profile.rb

class Profile < ActiveRecord::Base 
end 

응용 프로그램/모델/student.rb

require 'models/profile' 

class Student < Profile 
end 

응용 프로그램/모델/teacher.rb

require 'models/profile' 

class Teacher < Profile 
end