Rails类命名冲突

时间:2013-02-13 10:22:24

标签: ruby-on-rails rspec module namespaces

在我的rails应用程序中,我有以下内容:

  1. Post型号

    class Post < ActiveRecord::Base
      # ...
    end
    
  2. 这个模块里面的
  3. 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
    
  4. 两个Post模型都有不同的字段集并连接到不同的数据库:

    1. Post - &gt; Postgresql适配器
    2. MyModule::Models::Post - &gt; SQLite适配器
    3. 有时(取决于种子值),在运行测试套件时,我得到一个超奇怪的常量(?)碰撞:在提到原始Post常量的地方(在一个创建/更新操作)我得到错误,它缺少来自MyModule::Models::Post的字段,而在提到MyModule::Models::Post的地方 - 我得到一个错误,模型缺少来自Post的属性。

      其他线索:

      1. 我只在MyModule::Models::Post范围内使用MyModule,呼叫Models::Post
      2. 我从未在lib之外使用MyModule::Models::Post
      3. 所有“不同”模型都保存在一个文件lib/my_module/models.rb
      4. 如果我针对失败的规范登录pry会话,那么在ruby吹嘘MyModule::Models::Post之前没有字段的行之前(但Post的字段代替): MyModule::Models::Post返回完全原始的Post模型类!
      5. 我错过了什么?这是一个rspec问题吗?我是在搞乱惯例吗?

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

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

        更新3 。 RSpec有this提交。仍然,将Gemfile的rspec-mock更新为从github指向并没有帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你有数据库A 数据库B ,它们共享一些模型名称(虽然设置了完全不同的列),你必须确保在之后重置列名建立与数据库B的连接

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

DatabaseBBaseTable.descendants.each(&:reset_column_information)