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"})

といった形で出力される。