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提到的地方——我得到一个错误,模型缺少来自 origin 的属性Post

补充线索:

  1. 我只在范围内使用MyModule::Models::PostMyModule调用Models::Post
  2. 我从不MyModule::Models::Post在库之外使用。
  3. 所有“不同”的模型都保存在一个文件中,lib/my_module/models.rb
  4. 如果我登录到一个pry失败的规范的会话,在 ruby​​ 吹嘘MyModule::Models::Post它没有应该有的字段(而是来自Post而不是字段)的行之前:调用MyModule::Models::Post返回给我确切的原始Post模型类!

我错过了什么?这是一个 rspec 问题吗?我是在搞砸约定还是什么?

更新 1。我试图拆分Models模块,将每个附加模型放入一个单独的文件中。不走运——同样的错误

更新 2。另一个想法是:由于Comment模型是之前定义的Post,Ruby 尝试首先加载原始模型Post。尽管如此,将Post模型向上移动并没有帮助。

更新 3。RSpec 有这个提交。尽管如此,从 github 更新 Gemfilerspec-mock并没有帮助。

4

2 回答 2

0

你应该明确告诉 Rails 你的期望:

 belongs_to :post, class_name: 'MyModule::Models::Post'
于 2013-02-13T11:19:53.483 回答
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 回答