Rails 控制台不会自动加载第二个数据库的模型
-
03-07-2019 - |
题
我有一个 Rails 项目,其中有一个用于实际应用程序的 Postgres 数据库,但需要从 Oracle 数据库中提取大量数据。
数据库.yml 看起来像
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
我的模型源自 Oracle DB 上的数据,看起来像
class LegacyDataClass < ActiveRecord::Base
establish_connection "oracle_db"
set_primary_key :legacy_data_class_id
has_one :other_legacy_class, :foreign key => :other_legacy_class_id_with_funny_column_name
...
end
现在,按照习惯,我经常通过编写一些代码然后在 Rails 控制台中进行操作来完成很多早期开发(这是早期开发)。例如,在定义 LegacyDataClass 的所有关联之后,我将开始尝试类似的事情 a = LegacyDataClass.find(:first); puts a.some_association.name
. 。出乎意料的是,这会因为 LegacyDataClass 尚未加载而终止。
那么我可以 require 'LegacyDataClass'
这解决了问题,直到我需要 reload!
, ,这实际上不会重新加载它,或者直到我打开控制台的新实例。
因此问题是:
- 为什么 会发生这种情况吗?显然有一些我不理解的 Rails 魔法。
- 有什么方便的Rails 解决方法?
解决方案
我相信这可能与您的型号名称有关,而不是与您的联系有关。Rails 约定模型类名称采用驼峰命名法,而它们所在的文件采用小写+下划线。
因此,“LegacyModel”类应该位于 models/legacy_model.rb
. 。您关于的声明 "require 'LegacyDataClass'"
表明情况并非如此,因此 Rails 不知道如何自动加载该模型。
其他提示
我在工作中为一个应用程序编写了一些东西,可以在运行时处理与其他数据库的连接,它可能会有所帮助。
不隶属于 StackOverflow