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

私が見たところ、テストは、私が書いたライブラリで指定された Oracle データベースではなく、database.yml ファイルで指定された PostgresSQL データベースに対してカスタム検証を実行しようとしているように見えます。これが原因なのか、それが原因なのか、問題を解決する方法はよくわかりません。

私のライブラリファイルは次のようになります。

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

これが、2つのデータベースを構成した方法だと思います。同様の状況があります。レガシーデータベースとRailsActiveRecordベースのデータベースが混在しています。(私の場合はSQLServerとmysql)

これが私がそれを設定する方法です。(開発のみ表示):

config / database.yml:

aimdevelopment:
  adapter: sqlserver
  .... 

development: 
  adapter: mysql2
  .....

私のレガシーシステムはAIMと呼ばれています

次に、すべてのレガシーモデルが従うベースモデルを作成します。

models / 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」を管理しようとしたときにレールを回避したという事実が、あなたを困惑させているのかもしれません。

于 2012-08-21T16:25:21.923 に答える