ネイティブの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は可能ですか?