それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ActiveRecord を使って好きなデータベースにアクセス。注意点とか。始めにやることとか使い方の基本

任意のデータベースにActiveRecord でアクセスしよう。
ActiveRecordで何でもかんでもヤルと楽になる気がした。
RubyMySQLにアクセスしてデータ読み書きすれば便利そう

インストール

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 }

テーブルの一覧を見る

ActiveRecord::Base.connection.tables

テーブルの一覧取得できたら。irbSQLコンソールの代わりになるよね!

テーブルからカラム設定を取得する 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 をオフにしておくと捗る