MigrationでデータのCRUD操作を行う。
普通に、Model.new なり Model.create なりをすればいいのですが、それだと標準出力にログを残すためのメッセージを書かないといけない。これは面倒。というわけで、データ操作のためのDataStatementsクラスを記述する(スキーマ操作(create_table, add_indexなど)はSchemaStatementsクラス)。
なお、スキーマ操作は、Migrationのmethos_missingを利用して呼び出されている。Migration = (method missing) => AR::Base.connection (is a kind of AbstractAdapter) => SchemaStatements。これを見習って以下のようにする。
# plugin/webjourney/ext/active_record/lib/connection_adapters/abstract_adapter.rb module ActiveRecord module ConnectionAdapters # :nodoc class AbstractAdapter include DataStatements end end end
# plugin/webjourney/ext/active_record/lib/connection_adapters/abstract/data_statements.rb module ActiveRecord module ConnectionAdapters module DataStatements # insert a record def insert_record(table, data={}) obj = table.classify.constantize.new(data) yield obj obj.save! end # update a record def update_record(table, id, newdata = {}) obj = table.classify.constantize.find(id) newdata.each do |k,v| obj[k] = v end yield obj obj.save end # delete a record without ActiveRecord callbacks def delete_record(table, id) obj = table.classify.constantize.delete(id) end # delete a record with ActiveRecord callbacks def destroy_record(table, id) obj = table.classify.constantize.destroy(id) end end end end
で、こんな形でpluginを書いておくと、Migrationファイルに
insert_record("wj_users", :login_name => "guest") do |r| ... end
と見やすい記述できて、かつ、
-- insert_record("wj_users", {:login_name => "guest"})
といった形で出力される。