2013-02-13 130 views
2

在我的Rails应用程序,我有以下几点: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::PostMyModule范围内,调用Models::Post
  2. 我从来没有使用MyModule::Models::Post的lib之外。
  3. 所有“不同”的车型都保存在一个文件中,lib/my_module/models.rb
  4. 如果我登录到一个失败规范中的一个pry会议,其中红宝石吹嘘MyModule::Models::Post没有从Post领域应该有(但场前行取而代之):拨打MyModule::Models::Post返回我确切的原始Post模型类!

我错过了什么?这是rspec问题吗?我搞乱了会议还是什么?

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

更新2。另一个想法是:由于Comment模型在Post之前定义,所以Ruby首先尝试加载原始的Post。不过,移动Post模型并没有帮助。

更新3。 RSpec有this提交。不过,更新Gemfile的rspec-mock指向github没有帮助。

回答

0

它,你必须数据库中的数据库B,共享某些型号名称(虽然有完全不同的栏目设置),你必须请务必建立与数据库B连接后重置列名:

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

DatabaseBBaseTable.descendants.each(&:reset_column_information) 
0

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

belongs_to :post, class_name: 'MyModule::Models::Post' 
+0

遗憾的是,并没有帮助:( – gmile 2013-02-13 13:12:09