2013-04-23 3 views
2

레일즈 콘솔을 통해이 레코드가 존재하지 않음을 확인했습니다. 그러나이 코드를 실행하면 '존재합니다'라는 메시지가 콘솔에 출력됩니다.루비를 사용하여 데이터베이스를 쿼리하는 방법은 무엇입니까?

루비를 사용하여 데이터베이스를 쿼리하는 방법에 문제가 있습니까?

 if Companyavg.where(:company => 'goog', :word => 'baa') 
      puts 'it exists' 
     else 
      puts 'doesnt exist' 
     end 

답변

0

Companyavg.where(:company => 'goog', :word => 'baa).empty? 

문제가 where 통화가 쿼리를 반환하는 것입니다 시도하지만, 절대적에 가질 때까지 실제로 쿼리를 실행하지 않습니다. 그래서이 경우에 당신은 루비의 규칙에 따라서 true 인 non-nil, non-false 객체의 진리 값을 평가합니다.

+0

@ PinnyM의 솔루션은 [이 링크] (https://github.com/rails/rails/issues/3179)에 따르면 아마 약간 더 효율적이라고 보입니다. – charleyc

3

변경 :

if Companyavg.where(:company => 'goog', :word => 'baa') 

에 :이 present?를 사용하는 것보다 더 효율적입니다

if Companyavg.where(:company => 'goog', :word => 'baa').exists? 

는 올바른 결과를 반환하기 위해 최적화 된 쿼리를 실행할 수 있기 때문이다.

초기 쿼리는 ActiveRecord::Relation (간단히 말하면 지연되지 않은 쿼리)을 반환하므로 항상 사실입니다.

0

이것은 어디에서 빈 관계를 반환하기 때문입니다. 루비에서는 nil과 false 구문 만 false로 평가됩니다. 예를 들어 0과 ""(빈 문자열)은 참으로 평가됩니다.

+0

이것은 정확하지 않습니다. 빈 상태인지 여부를 아직 모르는 트리거되지 않은 관계를 반환합니다. – PinnyM

+0

죄송합니다 @PinnyM이 옳습니다. Ruby는 게으른 평가를 수행합니다. –

+1

Ruby는 정기적 인 평가를 수행합니다. ActiveRecord 쿼리는 게으른 평가를 수행합니다. – PinnyM

관련 문제