Загрузка моделей ActiveRecord в правильном порядке вне приложения rails

Как загрузить/требовать мои модели ActiveRecord в правильном порядке вне приложения rails. У меня много моделей STI, и я получаю неинициализированное постоянное исключение.

$:.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 загружалось каждый раз и развертывалось на всех рабочих машинах.

РЕДАКТИРОВАТЬ: Один момент, чтобы уточнить. Есть два проекта: проект Rails и проект, представляющий собой движок rails, который содержит мои модели. Я не загружаю сам движок rails своими заданиями resque, я просто использую приведенный выше фрагмент в отдельном классе для загрузки активной записи в моделях. Это всегда работало, пока я не добавил некоторые модели STI, которые из-за именования заставляли дочерние элементы пытаться загружаться раньше родительского. Проект rails engine отлично загружается в проекте rails, проблем нет, это просто потому, что я пытаюсь использовать активную запись вне проекта rails.


person dennis1600    schedule 24.04.2012    source источник
comment
Не могли бы вы опубликовать код? Что именно вы пробовали?   -  person klump    schedule 25.04.2012


Ответы (3)


Очень простое решение, если вы не хотите автозагрузки, — это потребовать базовый класс в дочерних классах. Явное требование зависимостей — это хорошо. :)

приложение/models/profile.rb

class Profile < ActiveRecord::Base
end

app/models/student.rb

require 'models/profile'

class Student < Profile
end

app/models/teacher.rb

require 'models/profile'

class Teacher < Profile
end
person deivid    schedule 27.04.2015

Модели будут загружаться автоматически при первом упоминании. Так что просто назовите их где-нибудь в правильном порядке (скажем, в config/initializers/load_order.rb):

Product
LineItem
Cart

и проверьте, помогает ли это.

person jdoe    schedule 24.04.2012
comment
Это не внутри приложения rails, поэтому инициализаторы не приносят мне много пользы. Само приложение rails запускается нормально и без проблем использует модели. - person dennis1600; 25.04.2012
comment
Что вы имеете в виду под внешним приложением Rails? Вы повторно используете свои модели где-то еще? - person jdoe; 25.04.2012
comment
да. Смотрите мое разъяснение в моем исходном посте. - person dennis1600; 25.04.2012

Я исправил свою проблему. Там может быть лучший способ, но это делает это для меня.

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
person dennis1600    schedule 25.04.2012
comment
Поздравляю с исправлением! Когда вы сможете, обязательно пометьте свой ответ как «принятый», чтобы другие могли извлечь уроки из вашего успеха. Ура~ - person Andrew Kozak; 25.04.2012