2010-08-19 5 views
4

저는 초보자입니다. 그리고 저는 같은 결과를 가져 오는 두 가지 다른 방법을 이해하게되었습니다.이 두 문장의 차이점은 무엇이며 왜 그 두 문장을 선택하겠습니까?

이 두 가지의 차이점은 무엇입니까? 어떤 상황에서 다른 상황에서 하나를 선택해야합니까?

예 1 :

Object.find(:all).select {|c| c.name == "Foobar" }.size 

예 2 :

Object.count(:conditions => ['name = ?', 'Foobar']) 

멀어져 참고는 :

나는 진지하게 내가이 일을 위해 모든 정답을 투표 할 수 있으면 좋겠다. 정말 고맙습니다. 방금 심각한 철저한 확인을 받았다.

답변

2

예 1에서 좋은 토론, 당신은 반복하는 이름는 foobar를 가지고 개체를 선택하고 그들 모두를 통해 데이터 저장소에서 모든 개체를 점점하고있다. 그리고 그 배열의 크기를 얻습니다. 예 1은 명백한 패자입니다.

예 1 SQL :

select * from whatever 
# then iterate over entire array 

두 실시 예는 데이터 스토어 내의 SQL WHERE 절을 실행한다. 이 쿼리 구축

:

select count(id) from whatever where name = 'foobar' 
# The SQL above is sql-server accurate, but not necessarily mysql or sqlite3 
+0

놀라운. 그런데 왜 첫 번째 예제를 사용하는 사람이 있습니까? – Trip

+1

@trip 아래 질문에 대답하려면 "왜 1이 존재합니까?"- # 1은 Find, Array (select) 메서드 및 또 다른 Array (count) 메서드의 세 가지 메서드입니다. –

+1

@trip - 쓰여지는 것처럼 # 1을 사용해서는 안됩니다.하지만 객체 배열이 있다면 select/collect를 사용하여 배열을 다른 배열로 조작하고 싶을 것입니다. map/reduce 타입의 것들. –

4

예 1이 충족하는 경우

SELECT * FROM objects 

는 다음 메모리에 개체의 컬렉션에 모든 레코드를 회전을 한 후 모든 객체를 반복 확인합니다 조건을 충족시킨 다음 조건을 충족하는 요소의 수를 계산합니다.

예 2 : - 조건을 충족 객체의 숫자 단지 정수를

SELECT count(id) FROM objects WHERE name = 'Foobar' 

는 SQL은 모든 노력을 수행 할 수 있습니다, 반환 :

이 쿼리를 구성한다.

은 일반적으로 당신이 원하는 어떤 2 ​​- 빠르고 적은 메모리 1은 DB에서 귀하의 기록 (가정 오브젝트가 액티브 모델이다)을 모두로드

2

예는 다음 반환 다음 세트를 절감하고, 루비를 사용하는 그 배열의 크기. 그래서 이것은 잠재적으로 메모리와 CPU가 무겁습니다 - 좋지 않습니다.

예제 2에서는 SQL에서 카운트를 수행하므로 모든 무거운 들어 올림은 루비가 아닌 데이터베이스에서 수행됩니다. 훨씬 더 :)

+0

위의 예와 관련이 있습니까? 1.) - if Object.name == "Foobar"/ 2.) Object (: conditions => [ 'name =?', 'Foobar'])? – Trip

관련 문제