2

私のrailsアプリケーションには、次のものがあります。

  1. Postモデル

    class Post < ActiveRecord::Base
      # ...
    end
    
  2. Postそのようなモジュール内のモデル

    # lib/my_module/models.rb
    module MyModule
      module Models
        class AbstractTable < ActiveRecord::Base
          self.abstract_class = true
        end
    
        class Comment < AbstractTable
          belogs_to :post
        end
    
        class Post < AbstractTable
          has_many :comments
        end
      end
    end
    

両方Postのモデルには異なるフィールドのセットがあり、異なるデータベースに接続されています。

  1. Post->Postgresqlアダプター
  2. MyModule::Models::Post->SQLiteアダプター

時々(シード値に応じて)、テストスイートを実行すると、非常に奇妙な定数(?)の衝突が発生します。元のPost定数が言及されている場所(作成/更新操作)では、からのフィールドがないというエラーが発生しますMyModule::Models::Post。言及されている場所にいる間MyModule::Models::Post、モデルに元の属性がないというエラーが発生しますPost

追加の手がかり:

  1. 私はスコープMyModule::Models::Post内でのみ使用し、、を呼び出しますMyModuleModels::Post
  2. 私はMyModule::Models::Postlibの外で使用することはありません。
  3. すべての「異なる」モデルは1つのファイルに保存されます。lib/my_module/models.rb
  4. 失敗した仕様のセッションにログインすると、pryrubyMyModule::Models::Postがフィールドを持たないことを自慢する行の前に(ただし、Post代わりにフィールドがあります)、呼び出すとMyModule::Models::Post正確な元のPostモデルクラスが返されます!

私は何が欠けていますか?これはrspecの問題ですか?私は慣習か何かを台無しにしていますか?

アップデート1。モジュールを分割しModelsて、すべての追加モデルを個別のファイルに入れようとしました。運がない–同じエラー

アップデート2。別の考えは、Commentモデルは以前に定義されているためPost、Rubyは最初にオリジナルをロードしようとするというものPostでした。それでも、Postモデルを上に移動しても効果はありませんでした。

アップデート3。RSpecにはこのコミットがありました。それでも、Gemfilerspec-mockをgithubからポイントするように更新しても効果はありませんでした。

4

2 に答える 2

0

データベース Aデータベース Bがあり、いくつかのモデル名を共有している場合 (列セットは完全に異なります)、データベース Bへの接続を確立した後に列名をリセットする必要があります。

DatabaseBBaseTable.establish_connection(adapter: 'sqlite3', database: ':memory:')
@connection = DatabaseBBaseTable.connection
DatabaseBSchema.define(@connection)

DatabaseBBaseTable.descendants.each(&:reset_column_information)
于 2013-04-20T19:46:56.390 に答える
0

Rails に期待することを明示的に伝える必要があります。

 belongs_to :post, class_name: 'MyModule::Models::Post'
于 2013-02-13T11:19:53.483 に答える