0

というモデルがありMaxます。

このレコードを見つけるためのより高速な方法は次のとおりです。

userが既に設定されているローカル変数であると仮定します。

Max.where(:user_id => user.id)

また

Max.find_by_user_id(user.id)

このクエリが頻繁に実行さuser_idれ、テーブルに列のインデックスがあるとしMaxesます。

どちらか一方に行くことに何か利点はありますか?つまり、より少ないクエリを生成しますが、実行は遅くなりますか、またはその逆ですか?

ありがとう。

4

2 に答える 2

4

.whereこのメソッドの主な利点は、ActiveRecord::Relation を返すことです(配列のように機能し、指定された条件に一致するレコードがない場合は空になる可能性があります)。のもう1 つの大きな利点は、それらを連鎖.whereできることです。これは、スコープに非常に役立ちます。

を使用する.find、オブジェクトが返されるか、ActiveRecord::RecordNotFoundエラーが発生します。


渡す ID に一致するユーザーがいないとします。

Max.find(-1) # => Raise ActiveRecord::RecordNotFound: Couldn't find Project with ID=-1

Max.where(id: -1) # => Returns an empty ActiveRecord::Relation, doesn't raise an error

アップデート

IRBコンソールで次の2つを試して比較しました(DBの〜620レコード)

User.find(User.all.map(&:id))
User.where(id: User.all.map(&:id))

同じクエリが生成され、同じ実行時間がかかります。

于 2012-11-28T21:35:20.740 に答える
2

実行する必要があるわずかな Ruby コードにもかかわらず、それらは同一です。

開発ログを確認してください。それらは同じ SQLを生成します。

私は新しい AREL 形式の方が好みです。より一般的で、必要な場合にのみ実行され、連鎖可能です。

于 2012-11-28T21:35:45.293 に答える