0

オブジェクトに1つ以上の子が含まれているかどうかを確認したいのですが:

if @question.replies.count > 0 
  // do this
else
  // do that
end

ただし、これに関連するdbルックアップは実行したくありません。このクエリを実行するための優れた効率的な方法はありますか?

4

3 に答える 3

2

:counter_cache(http://asciicasts.com/episodes/23-counter-cache-column)を使用するだけです

于 2012-06-14T17:05:23.137 に答える
2

を介して返信を既に読み込んでいる場合は、またはincludeを使用できます(詳細はこちら)。ステートメントを次のように簡略化することもできます@question.replies.length@question.replies.sizeif

if @question.replies.present?

それ以外の場合は、いつでもアクセスできるcounter_cache質問テーブル()の列を維持する列を使用できます。replies_count

于 2012-06-14T17:18:54.243 に答える
0

熱心にロードされたアソシエーションがある場合は、この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

于 2012-06-14T17:32:40.023 に答える