2010-07-30 6 views
5

Я знаю, что вы можете сделать что-то вроде этого, чтобы загрузить среду рельсов:Задачи ActiveRecord Migration & Rake не загружают модели?

task :my_task => :environment do 
    MyModel.find(1) 
    end 

Но, похоже, что код в модели не выполняется. Я использую act_as_audited, и есть хорошая функция класса, которая извлекает все модели, которые проверяются. Вызов выглядит что-то вроде:

Audit.audited_classes 

и указать модель, как быть проверяемым, то просто добавьте эту строку к моделям:

acts_as_audited 

Когда audited_classes выполняется в консоли, я получаю массив все мои проверенные классы; однако, когда я выполняю его из задачи rake (или миграции), я получаю пустой массив.

[EDIT]

После игры вокруг немного больше, я заметил, что, если эти модели фактически не загружены, пока они не упоминаются (т.е. отложенной загрузки). Я думал, что установка cache_classes в true в config исправит это, но они все еще кажутся ленивыми.

Одним из возможных решений может стать цикл всех моделей (как объясняется в этом сообщении: Is there a way to get a collection of all the Models in your Rails app?), но это кажется немного взломанным, и я надеялся, что есть более чистый способ.

Любые идеи?

Благодаря

ответ

1

Вы можете добавить конфигурационный/среду/development.rb:

Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize } 
+0

Да ... Я уже делал это, но его хак ... Я подал билет здесь: https://github.com/rails/rails/issues/5148 – gmoniey

+0

это не работает с моделями с именами, я не думаю. вы когда-нибудь сталкивались с именными делами? – jay

1

Это происходит, когда у вас есть config.threadsafe! в производственных средах, который автоматически устанавливает config.dependency_loading = false. Это предотвращает загрузку рельсов по классам моделей во время рейк-задач.

Чтобы обойти это, установите «config.dependency_loading = true, если $ rails_rake_task» в файле среды. Например, в моем production.rb у меня есть:

config.threadsafe! 
config.dependency_loading = true if $rails_rake_task 

или вы можете также сделать

config.threadsafe! unless $rails_rake_task 
Смежные вопросы