ActiveRecordで検索-find_by_*
find_by_*で属性を条件にデータを検索できます。
- find_by_*
- 属性を条件にして、それにマッチする最初のデータを取得
- find_all_by_*
- 属性を条件にして、それにマッチするデータをすべて取得
データ
テーブル定義:
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)
find_by_*
Kittenの属性を条件にして、マッチする最初のデータを取得します。「*」には属性名が入ります。また「find_by_hoge_and_foo」のような感じで条件を結合することも可能です。(ただし「and」での結合のみ)
class Kitten < ActiveRecord::Base def to_s return name end end #戻り値はKitten puts Kitten.find_by_name("mii") puts Kitten.find_by_age(2) # findのオプションも使える。 puts Kitten.find_by_age(1, :order=>"name DESC") puts Kitten.find_by_age(1, :order=>"name ASC") # andで結合することも可能。orはエラーになる。 puts Kitten.find_by_age_and_name(1, "mii") puts Kitten.find_by_age_or_name(1, "mii")
出力:
mii tora mii kuro mii /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1196:in `method_missing': undefined method `find_by_age_or_name' for Kitten:Class (NoMethodError) ....
find_all_by_*
Kittenの属性を条件にして、マッチするすべてのデータを取得します。
#戻り値はKitenの配列 puts Kitten.find_all_by_name("mii").join(",") puts Kitten.find_all_by_age(1).join(",") # findのオプションも使える。 puts Kitten.find_all_by_age(1, :order=>"name DESC").join(",") puts Kitten.find_all_by_age(1, :order=>"name ASC").join(",") # andで結合することも可能。orはエラー。 puts Kitten.find_all_by_age_and_name(1, "mii").join(",") puts Kitten.find_all_by_age_or_name(1, "mii").join(",")
出力:
mii mii,kuro mii,kuro kuro,mii mii /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1196:in `method_missing': undefined method `find_all_by_age_or_name' for Kitten:Class (NoMethodError) ....