0

我已经启动了一个提交到 PostgresSQL 数据库的表单,并且我已经对我的模型进行了大量测试以验证我的验证。但是,我创建了一个自定义验证器,它检查旧版 Oracle 数据库,以验证最终用户以表格形式提供的许可证号是否存在于旧版数据库中。通过命令行调试器,我可以验证我创建的库是否连接到数据库并返回结果,如果不满足条件,自定义验证器会导致模型无效。但是,当我针对我的模型运行单元测试时,测试运行时会发生错误。如果我删除自定义验证,测试运行通过。

PG::Error: ERROR:  relation "LICENSE" does not exist
      LINE 4:              WHERE a.attrelid = '"LICENSE"'::regclass
                                              ^
      :             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"LICENSE"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum

从我看到的情况来看,似乎测试正在尝试针对 database.yml 文件中指定的 PostgresSQL 数据库而不是我编写的库中指定的 Oracle 数据库运行自定义验证。我不太确定这是否是原因,或者是否是它发生的原因以及如何解决该问题。

这是我的库文件的样子:

module Legacy
  DB_CONFIG = YAML::load(File.open("#{Rails.root}/config/legacy_database.yml"))[Rails.env]

  class Legacy::License < ActiveRecord::Base
    establish_connection DB_CONFIG

    self.table_name = "LICENSE"
    self.primary_key = "LICENSE_ID"
  end
end

这是我的模型:

require "#{Rails.root}/lib/legacy.rb"

class Vehicle < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :permit_license, :name
  validate :validate_license

  def validate_license
    license = Legacy::License.where('license_number = ?', license_number)

    if license.empty?
      errors.add(:license_number, 'License not valid')
    end
  end
end

任何有关为什么会发生这种情况的见解都会有所帮助和赞赏。

4

1 回答 1

1

我认为这是您配置两个数据库的方式。我有类似的情况,一个遗留数据库与一个基于 Rails ActiveRecord 的数据库混合。(在我的情况下是 SQLServer 和 mysql)

这是我如何配置它。(仅显示开发):

配置/数据库.yml:

aimdevelopment:
  adapter: sqlserver
  .... 

development: 
  adapter: mysql2
  .....

我的旧系统称为 AIM

然后我为我的所有旧模型创建一个基本模型以遵循:

模型/目标.rb:

class Aim < ActiveRecord::Base
  establish_connection ("aim#{Rails.env}")
end

然后如果我需要连接到遗留数据库中的表

class Product < AIM
  self.table_name 'Product'
  self.primary_key 'ProductID'
end

我认为,当您尝试管理模块中的“建立连接”时,您绕过了导轨这一事实可能是让您搞砸的原因。

于 2012-08-21T16:25:21.923 回答