0

Railsアプリの外部でactiverecordモデルを適切な順序でロード/要求するにはどうすればよいですか?多くの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アプリを毎回ロードして、すべてのワーカーマシンにデプロイしたくない

編集:同様に明確にするための1つのポイント。Railsプロジェクトと私のモデルを含むRailsエンジンであるプロジェクトの2つのプロジェクトがあります。resqueジョブでrailsエンジン自体をロードしません。別のクラスで上記のスニペットを使用して、モデルにアクティブレコードをロードします。これは、名前が付けられているために子が親の前にロードされようとするSTIモデルを追加するまで、常に機能していました。Railsエンジンプロジェクトは、Railsプロジェクトで問題なくロードされます。これは、Railsプロジェクトの外部でアクティブレコードを使用しようとしているためです。

4

3 に答える 3

3

自動ロードしたくない場合の非常に簡単な解決策は、子クラスで基本クラスを要求することです。依存関係を明示的に要求することは良いことです。:)

アプリ/モデル/プロファイル.rb

class Profile < ActiveRecord::Base
end

アプリ/モデル/学生.rb

require 'models/profile'

class Student < Profile
end

アプリ/モデル/先生.rb

require 'models/profile'

class Teacher < Profile
end
于 2015-04-27T19:24:36.960 に答える
2

モデルは、最初のメンションで自動ロードされます。したがって、適切な順序で名前を付けるだけです(たとえば、 でconfig/initializers/load_order.rb):

Product
LineItem
Cart

そしてそれが役立つかどうかを確認してください。

于 2012-04-24T20:21:22.750 に答える
-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
于 2012-04-25T15:51:36.827 に答える