Railsに限らずSinatraやRuby単体でもSQlite3やMySQLのデータ読み書きを超便利にしてくれるActiveRecord。

で、読み書きする時のfindとfind_byとwhereの違いや使い方がちょっと分かりにくく、把握できるようになる為のシンプルなまとめを書いておく。

基本

require "sqlite3"
require "active_record"

ActiveRecord::Base.establish_connection(
  "adapter"  => "sqlite3",
  "database" => "./test.db"
)

class Foo <ActiveRecord::Base
end

呼び出し

find(primary key)

hoge = Foo.find(10)
fuga = Foo.find([10,20])

findはテーブルに登録してあるprimary keyを条件にデータを1つまたは配列で複数引っ張ってくる。上記の例だとFooテーブルのID(primary key):10のデータを引っ張ってくる。

primary keyで一つだけ拾ってくるのがfindだと思っていましたが、普通に配列で複数できたので修正。でもfindで複数持ってくる有用性ってなんだろう?早い?where使った方がいい気がする。

find_by()

hoge = Foo.find_by(:id => 10)
fuga = Foo.find_by(:id => 10, :bar =>'baz')

find_byは便利なメソッド。find_by(条件)でidの最後に追加されたデータを__1つ__引っ張ってくる(後述する.whereでorder id descでソートしてfirstで引っ張るのと一緒)

完全に勘違いだった。指定した条件で最初に登録されたデータを引っ張ってくる。最後のデータが欲しい場合は.order(“id desc”).find_by(:foo => ‘bar’)しないとダメみたい。うーん、便利だと思ってたんだけど、なんだかなぁ。

更に普通にfind(id)やwhere(:id => id)で検索してデータが無かった場合「ActiveRecord::RecordNotFound」を返すのだけど、find_byでデータが無い場合は__nil__を返す。これ超大事。

if Foo.find_by(:id => 10).nil?
  puts "nil"
end

とか簡単にできる。「ActiveRecord::RecordNotFound」を返すとプログラムが止まる事もあるので注意が必要。

追記:2014/04/16 当初find_by_idで書いていたけど、最新のActiveRecordでは非推奨らしく、find_by(:id => foo)と書くらしいのでそれに合わせて修正。

where()

array = [10,20,30]

hoge = Foo.where(:id => array)
fuga = Foo.where(:id => array).order("id desc").first

piyo = Foo.where(:id => array).order("id desc")
piyo.each do |data|
  puts "ID#{data.id}のデータ"
end

whereは好きなフィールドを検索して__複数__引っ張ってくる。なのでfirstとかlastとかeachなどが使える。

all

hoge = Foo.all

テーブルもしくはフィールドに登録してあるデータを全部引っ張ってくる。

first, first!

hoge = Foo.first
fuga = Foo.first!

最初にレコード(最新のレコード)を取得するコマンド。結構使う事多い。firstとfirst!の違いは、何もないfirstはデータが無かった場合nilを返し、first!は「ActiveRecord::RecordNotFound」を返します。

last, last!

hoge = Foo.last
hoge = Foo.last!

上に書いたfirstの逆版。最後のレコードを持って来る。lastとlast!の違いもnilかActiveRecord::RecordNotFoundの違い。

書き込み

新しくレコードを追加する

hoge = Foo.new
hoge.id = 100 # とか書いたけど普通idはprimary keyだわ
hoge.body = "hogehoge"
hoge.save # saveするまでレコードは追加されない

もしくは

Foo.create(
  :body => "hogehoge",
  :date => "2014-04-08",
end

で新しくレコードを追加する。必要に応じて使い分ける。

既に登録されているレコードを修正する

hoge = Foo.find_by_id(10)
hoge.body = "修正内容"
hoge.save

更新は1つのデータしかできないため、findやfind_byではなくwhereを使う時は

Foo.where(:id).oreder("id desc").first

みたいに1つのデータを選択しないといけないので注意。

削除

削除する場合はすごく簡単。

hoge = Foo.find(10)
hoge.destroy

デストロイした瞬間にレコードが消えます。複数消したい場合は

hoge = Foo.where(:id = [1,2,3])
hoge.destroy_all

destroy_allで削除できます。

Rails3レシピブック 190の技
SBクリエイティブ株式会社 (2013-09-01)
売り上げランキング: 25,737