アプリケーションを最新バージョンの Ruby & Rails にアップグレードする作業を行っています。私たちのアプリは、画像データ型の列を持つテーブルを持つレガシー データベース (SQL Server 2008 R2) と統合します (この列を varbinary(max) に変更することはできません)。以前は、バイナリをイメージ列に保存できました。ただし、現在、変換エラーが発生しています。
私たちは以下のアップグレードに取り組んでいます:
- レール 4.2.1
- ActiveRecord_SQLServer_Adapter (4.2.4)
- tiny_tds (0.6.3.rc1)
- freeTDS (v0.91.112)
画像列に保存しようとすると、次のようなエラーが発生します。
TinyTds::Error: 文字列の後の引用符が閉じていません
tiny_tds と activerecord_sqlserver_adapter 内のさまざまな問題を調査した結果、最初のテーブルと一致するがデータ型を image から varbinary(max) に変更する 2 番目のテーブルを作成することにしました。バイナリを列に保存できます。
課題の原因となっているコードは、s3 から画像を取得してローカルに保存し、画像をデータベースにプッシュするバックグラウンド ジョブにあります。繰り返しますが、レガシーデータベースを制御していないため、データ型を変更することはできません (または、そもそもデータベースに画像を保存する理由の問題に直面します)。
...
@d = Doc.new
...
open("#{Rails.root}/cache/pictures/image.png", "wb") do |file|
file << open(r.image.url).read
end
@d.document = File.binread("#{Rails.root}/cache/pictures/image.png")
@d.save!
アップグレードにより保存イメージが破損したため、修正を決定する最善の方法を見つけようとしています。機能するバージョンが見つかるまで、明らかにロールバックできます。ただし、修正が見つかることを願っています。誰にもアイデアはありますか?
更新: 挿入されるテーブルにトリガーがあったため、次の構成を追加しました。ActiveRecord::ConnectionAdapters::SQLServerAdapter.use_output_inserted = true
この構成を削除すると、次のエラーが発生します。
TinyTds::Error: The target table 'doc' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.
注: トリガーを変更することはできません。