I 객체가 1 개 이상의 어린이가 포함되어 있는지 여부를 확인하고 싶습니다 :개체에 하나 이상의 자식이 있는지 확인하는 데이터베이스 효율적인 방법은 무엇입니까?
if @question.replies.count > 0
// do this
else
// do that
end
그러나 나는 오히려이 관련된 DB 조회를하지 않을 것입니다. 이 쿼리를 수행하는 효율적인 방법이 있습니까?
I 객체가 1 개 이상의 어린이가 포함되어 있는지 여부를 확인하고 싶습니다 :개체에 하나 이상의 자식이 있는지 확인하는 데이터베이스 효율적인 방법은 무엇입니까?
if @question.replies.count > 0
// do this
else
// do that
end
그러나 나는 오히려이 관련된 DB 조회를하지 않을 것입니다. 이 쿼리를 수행하는 효율적인 방법이 있습니까?
그냥 사용 : 이미 include
을 통해 응답을로드 한 경우 counter_cache이 (http://asciicasts.com/episodes/23-counter-cache-column)
, 당신은 @question.replies.length
또는 @question.replies.size
(더 많은 정보 here)를 사용할 수 있습니다. 당신은 또한 당신이 당신이 언제든지 액세스 할 수있는 질문 표 (replies_count
)에 열을 유지하는 counter_cache
열을 사용할 수 있습니다, 그렇지 않으면
if @question.replies.present?
에 if
문을 단순화 할 수 있습니다. 당신이 열망로드 연관성이있는 경우 메모리에 연결을로드하지 않은 경우
후 다음 exists?
방법을 사용 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
를 사용합니다. 다시 DB에서 행 데이터를 얻기의 비용을 들이지 않고 일치하는 첫 번째 행을 찾기에 반환 EXISTS 검사에서
current_user.messages.each do |message|
if message.replies.exists?
else
end
end
exists?
호출 결과.
주
다른 옵션은 @dimuch에 의해 제안으로 counter_cache
approach을 사용하는 것입니다. counter_cache
솔루션은 DB 테이블 구조를 변경할 수 있다면 효율적입니다.
감사합니다 - 이것은 훌륭한 대답입니다. 그것은 완벽하므로 정답으로 표시하고 싶지만 @ dimuch의 counter_cache 참조가 실제로 가장 유용합니다. 그의 레퍼런스의 이름을 확인해 주시겠습니까?이 올바른 것을 표시해 드리겠습니다. –
이것이 가장 ** 효율적인 지 모르지만 (레일스 구문과 관련하여) : @ question.replies.limit (2)'이렇게하면 최대 2 개의 항목이 반환됩니다. . 이렇게하면 쿼리를 더 작게/더 빠르게 만들 수 있습니다. – MrDanA