2012-06-14 3 views
0

I 객체가 1 개 이상의 어린이가 포함되어 있는지 여부를 확인하고 싶습니다 :개체에 하나 이상의 자식이 있는지 확인하는 데이터베이스 효율적인 방법은 무엇입니까?

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

그러나 나는 오히려이 관련된 DB 조회를하지 않을 것입니다. 이 쿼리를 수행하는 효율적인 방법이 있습니까?

+0

이것이 가장 ** 효율적인 지 모르지만 (레일스 구문과 관련하여) : @ question.replies.limit (2)'이렇게하면 최대 2 개의 항목이 반환됩니다. . 이렇게하면 쿼리를 더 작게/더 빠르게 만들 수 있습니다. – MrDanA

답변

2

, 당신은 @question.replies.length 또는 @question.replies.size (더 많은 정보 here)를 사용할 수 있습니다. 당신은 또한 당신이 당신이 언제든지 액세스 할 수있는 질문 표 (replies_count)에 열을 유지하는 counter_cache 열을 사용할 수 있습니다, 그렇지 않으면

if @question.replies.present? 

if 문을 단순화 할 수 있습니다. 당신이 열망로드 연관성이있는 경우 메모리에 연결을로드하지 않은 경우

0

후 다음 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_cacheapproach을 사용하는 것입니다. counter_cache 솔루션은 DB 테이블 구조를 변경할 수 있다면 효율적입니다.

+0

감사합니다 - 이것은 훌륭한 대답입니다. 그것은 완벽하므로 정답으로 표시하고 싶지만 @ dimuch의 counter_cache 참조가 실제로 가장 유용합니다. 그의 레퍼런스의 이름을 확인해 주시겠습니까?이 올바른 것을 표시해 드리겠습니다. –

관련 문제