Rails控制台不会自动为第二个数据库加载模型

时间:2020-03-06 15:00:37  来源:igfitidea点击:

我有一个Rails项目,该项目具有用于实际应用程序的Postgres数据库,但需要从Oracle数据库中提取大量数据。

database.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);之类的事情。放入a.some_association.name。出乎意料的是,此操作死于尚未加载LegacyDataClass。

然后,我可以require'LegacyDataClass'来解决问题,直到我需要reload!,这实际上不会将其重新加载,或者直到我打开控制台的新实例为止。

因此,问题是:

  • 为什么会这样?显然有一些我不了解的Rails魔术。
  • 什么是便捷的Rails解决方法?

解决方案

我认为这可能与型号名称有关,而不是与连接有关。 Rails约定是模型类名称为CamelCase,而它们所在的文件为小写+下划线。

因此," LegacyModel"类应位于models / legacy_model.rb中。我们关于" require'LegacyDataClass'"的声明表明情况并非如此,因此Rails不知道如何自动加载该模型。

我为一个正在运行的应用程序编写了一些东西,该应用程序可以在运行时处理与其他数据库的连接。

http://github.com/cherring/connection_ninja