0

ネイティブのRailsデータベースとレガシーデータベースの両方を備えたRailsアプリがあります。

私はこれらのレガシーテーブルをうまくクエリしますが、レコードも挿入する必要があります。

ただし、レガシーテーブルはRailsの規則WRTキーに準拠していません。自動インクリメント整数の代わりに、レガシーキーは文字列です(常に0〜9の数字ですが、DBでは文字列属性のままです)。レガシーデータベースには、現在のインデックス値が格納されているテーブルがあり、挿入操作では、「current_index」テーブルから現在のインデックス値を読み取り、1ずつインクリメントし、値を「index_table」に保存してから、新しいインデックス値を返す必要があります。 value。これは、新しいキー値の挿入ステートメントで使用されます。

現在、さまざまなコントローラーに散在するレコードを挿入するために必要な手作りのSQLがあります。それをクリーンアップして、モデルに移動したいと思います。

現在私はこれを行います:

legend_table.db:

class LegacyTable < Ldb
  self.table_name = "legacyTableName"
  self.primary_key "legacyKeyName"
end

コントローラー内:

def insert_legacy_record(attrs)
  result = Ldb.connection.exec_query("
      DECLARE @key int;
      EXEC dbo.getKeyField @key OUTPUT, 'RecordKey';
      SELECT @key as ref_key;
    ")
    newkey = result.first['ref_key']

  result = Ldb.connection.exec_query("
    INSERT INTO legacyTableName 
    (legacyKeyName,foo,...) 
    VALUES 
    ('#{newkey}','#{attrs[:foo]}',...)
  ")
end

テーブル属性のリストとそれに対応する属性として入力された値を手動で維持する必要があるため、これは面倒です。

activeRecordのインデックス生成部分をオーバーライドできますか?私がこれを行うことができるように:

オプション1

@item = LegacyTable.new
@item.attributes(data)
@item.save  <=== somehow override new index value generation

または、新しいメソッドをオーバーライドして、生成された新しいキー値を返すようにする必要がありますか?

オプション2

newkey = LegacyTable.new(data)
@new = LegacyTable.find(newkey)

OPTION2の実行方法を知っていますが、OPTION1は可能ですか?

4

2 に答える 2

1

イニシャライザを作成できます。

module Extensions
  module LegacyModelId
    extend ActiveSupport::Concern

    included do
      before_create :generate_legacy_id

      def generate_legacy_id
        result = Ldb.connection.exec_query("
          DECLARE @key int;
          EXEC dbo.getKeyField @key OUTPUT, 'RecordKey';
          SELECT @key as ref_key;
        ")

        self.id = result.first['ref_key']
      end
    end
  end
end

レガシーモデルのそれぞれで:

class LegacyModelFoo < ActiveRecord::Base
  include Extensions::LegacyModelId

  ...
end

これによりbefore_create、拡張機能を含める各モデルにコールバックが追加され、ルックアップが実行されて新しいIDが割り当てられます。

于 2012-12-15T22:14:20.370 に答える
1

このようにモデルのcreateメソッドをオーバーライドするのはどうですか?LegacyTable

 def create
   # new_id = The code you use to get/set a new id for insertion
   self.id = new_id
   super # continue as normal
 end
于 2012-12-15T21:57:43.277 に答える