オブジェクトに1つ以上の子が含まれているかどうかを確認したいのですが:
if @question.replies.count > 0
// do this
else
// do that
end
ただし、これに関連するdbルックアップは実行したくありません。このクエリを実行するための優れた効率的な方法はありますか?
オブジェクトに1つ以上の子が含まれているかどうかを確認したいのですが:
if @question.replies.count > 0
// do this
else
// do that
end
ただし、これに関連するdbルックアップは実行したくありません。このクエリを実行するための優れた効率的な方法はありますか?
:counter_cache(http://asciicasts.com/episodes/23-counter-cache-column)を使用するだけです
を介して返信を既に読み込んでいる場合は、またはinclude
を使用できます(詳細はこちら)。ステートメントを次のように簡略化することもできます@question.replies.length
@question.replies.size
if
if @question.replies.present?
それ以外の場合は、いつでもアクセスできるcounter_cache
質問テーブル()の列を維持する列を使用できます。replies_count
熱心にロードされたアソシエーションがある場合は、このpresent?
方法を使用します
class User
has_many :messages
end
class Message
belongs_to :user
has_many :replies
end
current_user.messages.all(:include => :replies).each do |message|
if message.replies.present?
else
end
end
アソシエーションをメモリにロードしていない場合は、このexists?
メソッドを使用してください。
current_user.messages.each do |message|
if message.replies.exists?
else
end
end
このexists?
呼び出しの結果、EXISTSチェックが実行され、DBから行データを取得するコストをかけずに、最初に一致する行が見つかったときに返されます。
ノート
他のオプションは、 @dimuchによって提案されたcounter_cache
アプローチを使用することです。DBテーブル構造を変更できる場合、このソリューションは効率的です。counter_cache