2012-06-02 1 views

답변

13

모델 클래스가 이미로드 된 경우 Mongoid :: Document 모듈이 포함 된 모든 클래스를 찾아서 나열 할 수 있습니다.

Object.constants.collect { |sym| Object.const_get(sym) }. 
    select { |constant| constant.class == Class && constant.include?(Mongoid::Document) } 

아니면 그냥 클래스 이름을 원하는 경우 :

Object.constants.collect { |sym| Object.const_get(sym) }. 
    select { |constant| constant.class == Class && constant.include?(Mongoid::Document) }. 
    collect { |klass| klass.name } 

당신이 이런 식으로 그렇게 할 수있는이 프로그램을 실행하기 전에로드 모델을 강제해야하는 경우 (레일 3) :

Dir["#{Rails.root}/app/models/**/*.rb"].each { |path| require path } 

+2

경고 :'Object.constants'는 이름 공간 모델을 반환하지 않습니다. –

11

당신은 할 수있다 (당신의 모델의 모든 가정은 app/models 또는 하위 디렉토리에) Mongoid 버전 3.1 이상 : Mongoid.models

모델이 자동으로로드되지 않는 레일즈 개발 모드 인 경우 Rails.application.eager_load!을 실행하여 전체 애플리케이션을로드하십시오.

1

모든 몽고 이드 모델을 얻고, 선택적으로 수퍼 클래스로 필터링하도록 코딩 된 요점이 있습니다 (예 : 특정 클래스에서 상속받은 모델 만 얻으려는 경우).

https://gist.github.com/4633211

Mongoid.models

2

문제를 (스티브 솔루션에 비해, 그것은 또한 네임 스페이스 모델 작업 것은) 분명히에만 이미로드 모델을 반환합니다.

irb(main)> Mongoid.models 
=> [Admin, User] 

하지만 클래스 Device를 인스턴스화 한 후 같은 방법을 호출하는 경우, 내가 다른 결과를 얻을 : 나는 레일 콘솔에서 다음과 같은 실험을했다 (: Admin, UserDevice 나는 세 가지 모델을 가지고)

irb(main)> Device.last 
=> #<Device _id: 52c697494d616308cf380000, type_code: "666", name: "My device"> 
irb(main)> Mongoid.models 
=> [Admin, User, Device] 

이렇게하면 문제가 발생할 수 있습니다. 특히 방법이 레이크 작업에서 호출 된 경우 문제가 될 수 있습니다. Chris의 솔루션은 잘 작동하므로, 지금이 순간 최고의 옵션이라고 생각합니다. S (Rails 4로 Steve의 솔루션을 사용할 수는 없습니다).

+0

설명 된 문제를 해결할 'Rails.application.eager_load!'를 포함하도록 답변을 업데이트했습니다. – eltiare

관련 문제