トップ 最新の日記 ユーザー登録 ログイン ヘルプ

のびのびなRuby日記 このページをアンテナに追加 RSSフィード

2006-07-09

irbActiveRecordを楽しむの巻き irbでActiveRecordを楽しむの巻き - のびのびなRuby日記 を含むブックマーク はてなブックマーク - irbでActiveRecordを楽しむの巻き - のびのびなRuby日記 irbでActiveRecordを楽しむの巻き - のびのびなRuby日記 のブックマークコメント

この文章はなんなの?

irbを使用しRuby on Railsモデルクラスを呼び出して遊んでみようというのが、この文書の趣旨です。

最初にやることは?

呼びたいモデルクラスとdatabase.ymlファイルがある場所をメモしておきましょう。

この文書では、D:\Development\RadRailsWorkspace\RadRailsVer063\depot_o\app\models直下にあるordersモデルを呼び出す手順を記述します。

またD:\Development\RadRailsWorkspace\RadRailsVer063\depot_o\config直下にdatabase.ymlファイルを使用しデータベース接続します。

ordersテーブルとdatabase.ymlファイルの確認

f:id:NobiNobiKota:20060708210350j:image

f:id:NobiNobiKota:20060708210402j:image

  • database.ymlの確認
development:
  adapter: mysql
  database: depot_development
  host: localhost
  username: dave
  password: wibble
  encoding: utf8

次にやることは?

database_config.rbというファイルを作成し以下の内容をコピーします。またdatabase_config.rbファイルをDドライブの直下に保存しました(保存先はどこでも構いません)

=begin
ファイル名:database_config.rb
作成日:2006/7/8
=end

 #Active Recordをロード
require 'rubygems'
require_gem 'activerecord'

 #database.ymlファイルをロード
 #ディレクトリの区切りは、「/」(半角スラッシュ)にします。\マークだとエラーになります。
DATABASE_YML_FILE = 'D:/Development/RadRailsWorkspace/RadRailsVer063/depot_o/config/database.yml'
db_config = YAML::load(File.open(DATABASE_YML_FILE))

 #上で読み込んだdatabase.ymlファイルの内、developmentセクションに書いてあるデータベース接続情報を読み込んでdevelopmentセクションに設定したデータベースへ接続します。
ActiveRecord::Base.establish_connection(db_config['development'])

 #D:\Development\RadRailsWorkspace\RadRailsVer063\depot_o\app\models直下にあるorderモデルクラスをロード
ORDER_MODEL_PATH = 'D:/Development/RadRailsWorkspace/RadRailsVer063/depot_o/app\models/order'
require ORDER_MODEL_PATH

irbを起動して遊んでみる

  • irbを起動して、database_config.rbをロードする。database_config.rbをロードするとデータベース接続するのに必要な処理が実行され且つOrderモデルクラスもロードされます。
D:\>irb
irb(main):001:0> require 'database_config.rb'
=> true
  • ordersテーブルを全件検索した結果をordersという変数に代入
irb(main):002:0> orders = Order.find(:all)
=> [#<Order:0x3513d90 @attributes={"name"=>"Kate Hudson", "shipped_at"=>nil, "id"=>"1", "pay_type"=>"cc", "address"=>"NYC", "email"=>"kate@abc.com"}>,
 #<Order:0x35135c8 @attributes={"name"=>"Andrea Anders", "shipped_at"=>nil, "id"=>"2", "pay_type"=>"check", "address"=>"LA", "email"=>"Andrea@abc.com"
}>, #<Order:0x3513580 @attributes={"name"=>"Joey Tribiani", "shipped_at"=>nil, "id"=>"3", "pay_type"=>"cc", "address"=>"LA", "email"=>"joey@HowAreYouD
oing.com"}>]
  • ordersからorderを一つずつ取り出して、それぞれのorderの名前とEmailアドレスを表示する
irb(main):003:0> orders.each{|order|
irb(main):004:1*   printf("Name: %s\tEmail: %s\n",order.name,order.email)
irb(main):005:1> }
Name: Kate Hudson       Email: kate@abc.com
Name: Andrea Anders     Email: Andrea@abc.com
Name: Joey Tribiani     Email: joey@HowAreYouDoing.com
irb(main):007:0> LA_User = {:find => {:conditions => "address = 'LA'"}}
=> {:find=>{:conditions=>"address = 'LA'"}}
irb(main):008:0> Order.with_scope(LA_User) do
irb(main):009:1*  Order.find_by_name("Kate Hudson")
irb(main):010:1> end
=> nil  #検索結果0件なのでnilが返ってくる。

LA_User = {:find => {:conditions => "address = 'LA'"}}は検索する範囲を限定しています。この場合だとOrdersテーブルからaddressカラムがLAという値であるレコード以外は全てマスクして、この条件に該当するレコード内で、以下のブロックに挟まれたOrder.find_by_name("Kate Hudson")を実行します。

Order.with_scope(LA_User) do
 Order.find_by_name("Kate Hudson")
end

この場合だとselect * from orders where address = 'LA' and name = 'Kate Hudson'というSQL文が実行されたのと同じです。そしてこのQueryに対する検索結果は0件ですので、irb上でもnilが返ってきています。

ここで新たにaddressカラムの値がNYCであるレコード以外をマスクするためにNYC_User = {:find => {:conditions => "address = 'NYC'"}}を追加してみます。

irb(main):011:0> NYC_User = {:find => {:conditions => "address = 'NYC'"}}
=> {:find=>{:conditions=>"address = 'NYC'"}}

そしてwith_scopeにNYC_Userを渡して、Order.find_by_name("Kate Hudson")を実行してみます。

irb(main):012:0> Order.with_scope(NYC_User) do
irb(main):013:1* Order.find_by_name("Kate Hudson")
irb(main):014:1> end
=> #<Order:0x5543038 @attributes={"name"=>"Kate Hudson", "shipped_at"=>nil, "id"=>"1", "pay_type"=>"cc", "address"=>"NYC", "email"=>"kate@abc.com"}>

上記の場合、1件の検索結果が返ってきました。

この場合select * from orders where address = 'NYC' and name = 'Kate Hudson'が実行されたのと同じです。

ordersテーブルへデータを1件追加してみましょう。

irb(main):015:0> new_order = Order.new
=> #<Order:0x553f1e0 @attributes={"name"=>"", "shipped_at"=>nil, "pay_type"=>"", "address"=>"", "email"=>""}, @new_record=true>

irb(main):016:0> new_order.name = "Joel Spolsky"
=> "Joel Spolsky"

irb(main):017:0> new_order.shipped_at = nil
=> nil

irb(main):018:0> new_order.address = "NYC"
=> "NYC"

irb(main):019:0> new_order.email = "joel@sample.com"
=> "joel@sample.com"

irb(main):020:0> new_order.save   #ordersテーブルへ永続化
=> true

ordersテーブルにレコードが1件追加されたかどうかを確認してみます。

f:id:NobiNobiKota:20060709113706j:image

確かにordersテーブルにレコードが1件追加されています。

先程ordersテーブルに追加したidが4のレコードnameとemailを更新してみましょう。

D:\>irb
irb(main):001:0> require "database_config"
=> true
irb(main):002:0> order = Order.find(4)
=> #<Order:0x3514f90 @attributes={"name"=>"Joel Spolsky", "shipped_at"=>nil, "id"=>"4", "pay_type"=>
"", "address"=>"NYC", "email"=>"joel@sample.com"}>
irb(main):003:0> order.name = "Reese Witherspoon"
=> "Reese Witherspoon"
irb(main):004:0> order.email = "reese@abc.com"
=> "reese@abc.com"
irb(main):005:0> order.save
=> true
irb(main):006:0> order = Order.find(4)
=> #<Order:0x34fe0a0 @attributes={"name"=>"Reese Witherspoon", "shipped_at"=>nil, "id"=>"4", "pay_ty
pe"=>"", "address"=>"NYC", "email"=>"reese@abc.com"}>

更新後、ordersテーブルを確認してみましょう。idが4のnameとaddressが更新されていますね。

f:id:NobiNobiKota:20060709113720j:image

先程追加したidが4のデータ削除してみます。

irb(main):015:0> order = Order.find(4)
=> #<Order:0x34e0f40 @attributes={"name"=>"Reese Witherspoon", "shipped_at"=>nil, "id"=>"4", "pay_ty
pe"=>"", "address"=>"NYC", "email"=>"reese@abc.com"}>

irb(main):016:0> Order.delete(4)
=> 1

irb(main):017:0> order = Order.find(4)
ActiveRecord::RecordNotFound: Couldn't find Order with ID=4
        from C:/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:955:in
 `find_one'
        from C:/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:941:in
 `find_from_ids'
        from C:/ruby-1.8/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:382:in
 `find'
        from (irb):19

削除後ordersテーブルを確認してみます。

f:id:NobiNobiKota:20060709113732j:image

4番目のデータ削除されていますね(^^)