mailer作成 その2

POP3で取り込んだメールをDBに保存するようにはできたのだが、メールの一覧を表示させたら、Subject(とContent)が文字化けしてしまう。
Contentをメールの一覧に含めることは考えていないが(Railsデフォールトはすべてのカラムを表示させてしまうようにしているため)、まじめに一覧表示をさせたときに、Subjectが化けているのは、ありえない。
なんで文字化けするのかわからなくて、嵌っていたのだが、取り込んだメールからMailParserで(TMailではない)Subjectなどを取り出したときに、コード変換されることを忘れていた。
デフォールトのコード変換は、euc-jpだそうで、JISと思い込んで、せっせとそれをUTF-8に変換しようとしていた。コード変換にutf-8を指定して、SubjectのカラムをBLOBにしたら、(BLOBにしたのは、コード変換の問題に気づく前にとりあえずそのまま格納させようとしたので、)ちゃんと表示できるようになった。
Subjectのカラムは、BLOBではなくて、TEXTにしても大丈夫であることを確認。
あと、現時点での大きな問題は、取り込んだメールの判定をunique_idで判定しているのだけど、メールを取り込む前にunique_idを読み込もうとすると、それをどこかのキャッシュから読んでいるようで、いったんメールを保持するDBをdropしても、古いメールをとりこんでくれないばかりか、なぜか新しいメールも取り込みにいけないこと。ActiveRecordのマニュアルのどこかでCacheという単語をみかけたが、それがそうなのかどうかは不明。
新しいメールを取り込んでくれないのは、ActiveRecord::findで取得した配列?からunique_idを探すやり方がまずいみたい。consoleで


>> l = Mail.find(:all, :select => 'unique_id')
とやって、得られたオブジェクトのたとえば10番目の要素を表示してみると以下のようになる。

>> p l[10]
#"799393977975495F84ZX49ZX5F9991VXZ"}>
=> nil
>> puts l[10]
#
=> nil
index()にunique_idを指定して、検索しているつもりだったのだが、この結果からすると、この配列の要素は単なるStringではないためと思われる。
[2006/07/06追記]
Mail.find(:all, :select => 'unique_id')として得られるオブジェクトは、上の結果から、attributesというフィールドを持つクラスで、このフィールドはHashのデータを保持していることになる。Hashのキーは、カラム名で、:selectで指定したカラムの名前をキーとするHashデータになっている。つまり、得られた配列の10番目の要素のunique_idを取得したいのなら、

l[10].attirubtes['unique_id']

だし、

Mail.find(:all, :select => 'unique_id, mail_from')

で検索すれば、

l[7].attributes['mail_from']

と、書けると思われる。