我已经开始提交一个提交到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
任何了解这种情况发生的原因都会有所帮助和赞赏。
答案 0 :(得分:1)
我认为这是你配置这两个数据库的方式。我有类似的情况,Legacy数据库与基于Rails ActiveRecord的数据库混合。 (在我的例子中是SQLServer和mysql)
以下是我如何配置它。 (仅显示开发):
配置/ database.yml中:
aimdevelopment:
adapter: sqlserver
....
development:
adapter: mysql2
.....
我的遗产系统称为AIM
然后我为所有我的传统模型创建一个基本模型:
模型/ aim.rb:
class Aim < ActiveRecord::Base
establish_connection ("aim#{Rails.env}")
end
然后,如果我需要连接到旧数据库中的表
class Product < AIM
self.table_name 'Product'
self.primary_key 'ProductID'
end
我认为当你试图管理模块中的'establish_connection'时,你已经绕过了轨道,这可能会让你感到困惑。