我有一个 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 不知道如何自动加载该模型。

其他提示

我在工作中为一个应用程序编写了一些东西,可以在运行时处理与其他数据库的连接,它可能会有所帮助。

http://github.com/cherring/connection_ninja

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top