2013-02-13 133 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