file_column を使ってファイルを保存する

file_column プラグインと言えば、普通はファイルのアップロードに使うもの。しかし、実際には既存のファイルを新システムに移行させるときなどに、ローカルにあるファイルをデータベースに登録したいときがある。

たとえば、Entry モデルに image という属性があったとする。これを file_column 指定してファイル名を保存できるようにする。

class Entry < ActiveRecord::Base
  file_column :image
end

普通は、次のようなフォームを作ってファイルをアップロードする。

<% form_tag({:action => 'create'}, :multipart => true) do %>
<%= file_column_field 'entry', 'image'  %></p>
<% end %>

このフォームの代わりに次のようなコードにしてもよい。

e = Entry.find(:first)
File.open(image_file_path) do |f|
  e.image = f
  e.save
end

ポイントは e.image = f のように、ファイル用カラムに File オブジェクトを代入すること。あとはアップロードとまったく同じように処理してくれる。まったく便利だ。