findとwhere(id: XXX).firstの違い
両方ともidで絞り込みをかけるがその他の挙動が違う箇所が多いのでメモ
find
- 返り値はレシーバーのオブジェクト
- DB問い合わせを行う
- 発行SQLにorder by id descが付与されない
$ User.find(1).class
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
=> User
where
- 返り値は
ActiveRecord_Relation
のオブジェクト -
where().first
、where().map()
などデータを操作するタイミングでDB問い合わせを行う - 発行SQLに
ORDER BY "users"."id" ASC
が付与される
$ User.where(id: 1).class
=> User::ActiveRecord_Relation
$ User.where(id: 1).first
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
=> #<User:0x00007fffcb3d3e98