ActiveRecordで検索
ActiveRecord::Base#find でテーブルからデータを検索できます。
引数に応じて以下の検索が可能です。
- IDで検索
- 条件にマッチする最初のデータを検索
- 条件にマッチするすべてのデータを検索
データ
テーブル定義:
CREATE TABLE kittens ( id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(255), color VARCHAR(255), age int(4) );
データ:
mysql> select * from kittens; +----+-------+-------+------+ | id | name | color | age | +----+-------+-------+------+ | 1 | mii | gray | 1 | | 2 | tora | brown | 2 | | 3 | kuro | black | 1 | | 4 | shiro | white | 3 | +----+-------+-------+------+ 4 rows in set (0.00 sec)
IDで検索
findの引数にIDやをIDの配列を指定すると、「IDで検索」となります。
サンプル:
class Kitten < ActiveRecord::Base def to_s return name end end # IDを1つ指定して取得。戻り値はKitten puts Kitten.find(1) # IDを複数指定して取得。戻り値はKittenの配列 puts Kitten.find(1, 3).join(",") puts Kitten.find([2, 4]).join(",") # ID + 検索条件を指定(APIドキュメントに記載があったが、いつ使うのかよくわからない・・) puts Kitten.find(1, :conditions=>"age = 1") # ID + 検索条件を指定 # 該当するデータが無いため、RecordNotFoundのエラーとなる puts Kitten.find(1, :conditions=>"age = 2")
出力:
mii mii,kuro tora,shiro mii /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1031:in `find_one': Couldn't find Kitten with ID=1 AND (age = 2) (ActiveRecord::RecordNotFound) from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1014:in `find_from_ids' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:419:in `find' ...
条件にマッチする最初のデータを検索
引数に「:first」を指定すると、条件にマッチする最初のデータを検索します。
サンプル:
# 最初のデータを取得。戻り値はKitten puts Kitten.find(:first) # 検索条件付きで最初のデータを取得 puts Kitten.find(:first, :conditions=> "age = 1" ) puts Kitten.find(:first, :conditions=> "color = 'brown'" ) # ソート条件付きで最初のデータを取得 puts Kitten.find(:first, :order=> "age DESC" ) puts Kitten.find(:first, :order=> "age ASC" ) # 取得位置を指定, # shiro,tora,mii,kuro の順にソート後、2番目以降の最初のデータを返す。 puts Kitten.find(:first, :order=> "age DESC", :offset=>1 ) # 条件にマッチするデータがない。nilが返される。 puts Kitten.find(:first, :conditions=> "age = 10" )
出力:
mii mii tora shiro mii tora nil
条件にマッチするすべてのデータを検索
引数に「:all」を指定すると、条件にマッチするすべてのデータを検索します。
サンプル:
# 全のデータを取得。戻り値はKittenの配列 puts Kitten.find(:all).join(",") puts "---" # 検索条件にマッチするすべてのデータを取得 puts Kitten.find(:all, :conditions=> "age = 1" ).join(",") puts Kitten.find(:all, :conditions=> "color = 'brown'" ).join(",") puts "---" # ソート条件付き puts Kitten.find(:all, :order=> "age DESC" ).join(",") puts Kitten.find(:all, :order=> "age ASC" ).join(",") puts "---" # 取得位置/取得数を指定, puts Kitten.find(:all, :offset=>1 ).join(",") # 効果がない。すべての一覧が返されてしまう・・。 puts Kitten.find(:all, :limit=>2 ).join(",") puts Kitten.find(:all, :offset=>1, :limit=>2 ).join(",") puts "---" # グループ化 puts Kitten.find(:all, :group=> "age" ).join(",") puts "---" # 条件にマッチするデータがない。空の配列が返される。 puts Kitten.find(:all, :conditions=> "age = 10" ).join(",")
出力:
mii,tora,kuro,shiro --- mii,kuro tora --- shiro,tora,mii,kuro mii,kuro,tora,shiro --- mii,tora,kuro,shiro mii,tora tora,kuro --- mii,tora,shiro ---