-
Notifications
You must be signed in to change notification settings - Fork 3
Factoryfilterについて
baban edited this page Jun 9, 2013
·
7 revisions
データをload、dumpを行う直前にデータを加工したい場合 flexturesの内部で用意されているfactory filterの機能を使って解決することができます factory filterは「config/flextures.factory.rb」に記述をして下さい
この例は、ユーザーの最終ログイン日時を3日前に指定して読み込む記述の例です usersテーブルのデータを読み込む際に、登録されたフィルタが読み出されてデータを加工します
Flextures::Factory.define :users do |f|
f.last_login_date = 3.days.ago
end
通常はテーブルの名前からActiveRecordのモデル名を推測して紐付けを行いますが それが出来ない場合はdefineメソッドの第2引数にモデルを指定してやる事で、紐付けが可能です データの読み込みが出来ないテーブルが出てきた場合は、大抵この引数の指定で解決可能です
Flextures::Factory.define :users, User do |f|
f.last_login_date = 3.days.ago
end
フィルタ本体のブロックは第2引数移行も受け取ることができます
Flextures::Factory.define :users do |f,filename,extantion|
f.last_login_date = 3.days.ago
end
受け取れる引数は以下のようになっています
argument | description |
---|---|
1 | テーブル名 |
2 | 読み込んだファイルのファイル名 |
3 | 読み込んだファイルの拡張子(:csv または :yml ) |
factory filter は dump のためのフィルタも提供しており Dump時には、以下の様な書式で、ダンプするデータを加工する事が可能です
Flextures::DumpFilter.define :users, {
:encrypted_password => lambda { |v| Base64.encode64(v) }
}
データを加工したいテーブルの名、加工したいカラム名と処理を記述したラムダをハッシュで引き渡します
上の例は、パスワードを格納したカラムをエンコードしてダンプします 何らかの原因でデータの読み出し時に結果が変わってしまう場合 基本的にはBase64エンコードでバイナリにして吐き出して、ロード時にデコードしなおせば、吐き出せないデータはまずないので これが安全策です