在我的rails应用程序中,我有以下内容:
Post
型号
class Post < ActiveRecord::Base
# ...
end
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
模型都有不同的字段集并连接到不同的数据库:
Post
- &gt; Postgresql适配器MyModule::Models::Post
- &gt; SQLite适配器 有时(取决于种子值),在运行测试套件时,我得到一个超奇怪的常量(?)碰撞:在提到原始Post
常量的地方(在一个创建/更新操作)我得到错误,它缺少来自MyModule::Models::Post
的字段,而在提到MyModule::Models::Post
的地方 - 我得到一个错误,模型缺少来自Post
的属性。
其他线索:
MyModule::Models::Post
范围内使用MyModule
,呼叫Models::Post
,MyModule::Models::Post
。lib/my_module/models.rb
pry
会话,那么在ruby吹嘘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 :(得分: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)