任意のデータベースにActiveRecord でアクセスしよう。
ActiveRecordで何でもかんでもヤルと楽になる気がした。
RubyでMySQLにアクセスしてデータ読み書きすれば便利そう
インストール
gem install activerecord sudo aptitude install libmysql-ruby #mysql 関連のパッケージがRubyに含まれていない場合
使い方
require "rubygems" require "active_record"
簡単にロードすることができます。
データベースに接続する。
ActiveRecord::Base.establish_connection( :adapter=>"mysql", :host =>"localhost", :database =>"epgrec", :username=>"epgrec_user", :password=>"XXXXX", :encoding=>"utf8", )
検索するため、テーブルとクラスをマッピングする
テーブル | Recorder_reserveTbl |
---|---|
クラス | Reserve |
にマッピングする。ための目的には次のコードを使う。
class Reserve < ActiveRecord::Base set_primary_key :id set_table_name :Recorder_reserveTbl end
簡単ですね。
type というカラム名はErrorになる。
type というカラム名はActiveRecordが自動的にサブクラスにマッピングするので、サブクラスがないエラー。たまたまTypeがカラム名に採用されていてエラー
ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass: 'GR'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite Reserve.inheritance_column to use another column for that information.
サブクラス呼び出しの予約語を別にする。
type がサブクラス呼び出しになってしまう。予約語 type を sub_type_class に変更
class Reserve < ActiveRecord::Base set_primary_key :id set_table_name :Recorder_reserveTbl set_inheritance_column :sub_type_class #予約語 type を sub_type_class に変更 end
検索する
a = Reserve.find(782) a= Reserve.find(:all,:conditions=>"starttime > '2011-07-11 0:00' and endtime < '2011-07-18 0:00'"). a.each{|w| puts w.path }
テーブルからカラム設定を取得する columns
Reserve.columns.map{ |column| column.name}
カラム名を取得してみる。
Reserve.columns.map{ |column| column.name} #=> ["id", "channel_disc", "channel_id", "program_id", "type", "channel", "title", "description", "category_id", "starttime", "endtime", "job", "path", "complete", "reserve_disc", "autorec", "mode", "dirty"]
さらに、テーブルのカラムのデータ型も併せて。
Reserve.columns.map{ |column| [column.name,column.type, column.sql_type]} #=> [["id", :integer, "int(11)"], ["channel_disc", :string, "varchar(128)"], ["channel_id", :integer, "int(11)"], ["program_id", :integer, "int(11)"], ["type", :string, "varchar(8)"], ["channel", :string, "varchar(10)"], ["title", :string, "varchar(512)"], ["description", :string, "varchar(512)"], ["category_id", :integer, "int(11)"], ["starttime", :datetime, "datetime"], ["endtime", :datetime, "datetime"], ["job", :integer, "int(11)"], ["path", :binary, "blob"], ["complete", :boolean, "tinyint(1)"], ["reserve_disc", :string, "varchar(128)"], ["autorec", :integer, "int(11)"], ["mode", :integer, "int(11)"], ["dirty", :boolean, "tinyint(1)"]]
テーブルのカラムの一覧は、ActiveRecord::Base#columnsで取得できる。
テーブル定義分からくても、テーブル一覧(connection.tables)を見てクラス化して、その後、columnsで各カラムを取得すればいい
オススメirb 設定
irb の自動echo 出力のON/OFFを切替える - ブックマクロ開発に
>> conf.echo=false
ActiveRecordのオブジェクトのinspectが走ると遅いので、ActiveRecordを使うときだけはinspect をオフにしておくと捗る