Задачи ActiveRecord Migration & Rake не загружают модели? - PullRequest
5 голосов
/ 30 июля 2010

Я знаю, что вы можете сделать что-то подобное для загрузки среды rails:

  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 в конфиге исправит это, но они все еще кажутся загруженными лениво.

Одним из возможных решений было бы перебрать все модели (как описано в этом посте: Есть ли способ получить коллекцию всех Моделей в вашем приложении Rails? ), но этокажется немного глупым, и я надеялся, что есть более чистый способ.

Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 марта 2013

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

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

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

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

config.threadsafe! unless $rails_rake_task
1 голос
/ 31 марта 2012

Вы можете добавить config / environment / development.rb:

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