yamazのRails日記 このページをアンテナに追加 RSSフィード

2007-10-24file_column でイメージファイルの保存ディレクトリを動的に変更する このエントリーを含むブックマーク

id:elm200さんがfile_column でイメージファイルの保存ディレクトリを変更する方法を書いておられる.

http://d.hatena.ne.jp/elm200/20070917/1190033653

この方法でもpublic/images/file_column/(モデル名)/(カラム名)/(ID)/とやっぱり一個のディレクトリにたくさんファイルが置かれることになるので,あまりうれしくない.


public/images/file_column/YYYYMMDD/(モデル名)/(カラム名)/(ID)


という風にもっと動的にやりたいな思っていたところ下記の方法が見つかったので,ご紹介.


マイグレーションファイルはこんな感じ.

 t.column :image, :string
 t.column :created_on, :date

モデルはこんな感じ.

class Entry < ActiveRecord::Base
  file_column :image, :store_dir => :store_dir_name

  def store_dir_name
    "images/file_column/#{created_on.strftime('%Y/%m/%d')}/#{self.class.name.underscore}/image"
  end
end

file_columnのオプション:store_dirの値をSymbolにするのがミソで,

こうしておくとそのSymbol名のメソッドが評価される.


また今回の例ではコールバックの予約語created_onを使って自動的に作成日が入るようにしてある.


結果root_path(通常はpublic/)/にstore_dir_nameを評価した結果のディレクトリに格納できるようになった.

日付ごとのディレクトリにしておけばrsyncコストも小さくできるので,うれしいですよね.


あとカラム名を取得できれば完璧だったんだけど,やり方がわかりませんでした(ションボリ)

そのほか

rubyスクリプトtest.rb」をアップロードすると「test.rb.txt」に強制的に変更されちゃうよ?

file_columnはデフォルトでmimeタイプを決定して適切な拡張子をつけてくれる.

この判別はfileコマンドで行っていて,その結果例えばrubyスクリプトtest.rb」を

格納しようとすると「test.rb.txt」に強制的に変更されてしまうようだ.

この自動変換をやめたい場合は:fix_file_extensions => falseをつけるのが正解


カラムファイルオブジェクトとして扱いたいです.

こんな感じでしょうか?

  entry = Entry.new
  entry.image = File.new(filename)
  entry.save

  entry = Entry.find(:first)
  image_file = File.new(entry.image)
トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20071024