2012-06-20 2 views
0

테이블에서 가져온 행 집합이 있습니다. 오브젝트 레이팅을 가정 해 봅시다. 이 객체를 가져온 후 데이터베이스에서 100 개의 항목을 말합니다.ActiveRecord Association 콜렉션 객체에 대한 쿼리

평가의 목적은 다음과 같습니다

table_ratings 
t.integer :num 

그래서 내가 지금 무엇을 원하는 다른 쿼리를 수행하지 않고이 100 행에 대한 몇 가지 계산을 수행합니다.

r = Rating.all 
good = r.where('num = 2') # this runs an additional query 
"#{good}/#{r.length}" 

이것은 내가하고 싶은 것을 매우 거친 생각이다, 나는 구축하기 위해 다른 더 복잡한 출력이 : 내가 추가 쿼리를 실행,이 작업을 수행 할 수 있습니다. 이 행에서 수행해야하는 10 가지가 넘는 계산이 있다고 가정하고 SQL 쿼리에서 앨리어싱을 지정하는 것이 가장 좋은 방법은 아닙니다.

위의 r.where 쿼리를 대체하는 효율적인 방법은 무엇입니까? 거기에 루비 메서드 또는 내게 ActiveRecord 협회 컬렉션 개체에 비슷한 쿼리 API를 줄 보석인가요?

답변

2

Rating.all은 모든 Rating 객체의 배열을 반환합니다. 여기에서 배열에서 선택하고 매핑하는 데 초점을 맞 춥니 다. 예를 들면 :

@perfect_ratings = r.select{|x| x.a == 100} 

참조 :

http://www.ruby-doc.org/core-1.9.3/Array.html

추가 코멘트 :

배열에 대해 사용 가능한 메소드의리스트를 가고, 나 자신이 자주 다음을 사용하여 찾을 수 있습니다 :

변수를 확인하려면 이달 여러 값 :

%w[dog cat llama].include? @pet_type # returns true if @pet_type == 'cat' 

다른 배열을 생성하기 위해 (지도 및 수집은 별명)

%w[dog cat llama].map(|pet| pet.capitalize) # ["Dog", "Cat", "Llama"] 

정렬 중복 삭제하려면 요소를 추가

%w[dog cat llama dog].sort.uniq # ["cat", "dog", "llama"] 

<<+ 배열을 추가하려면 flatten을 사용하여 포함 배열을 단일 레벨 배열 count 또는 length 또는 0으로 병합합니다.은 요소 수이고, join은 내가 많이 사용하는 다른 요소입니다.

마지막으로, 여기 join의 예입니다

%w[dog cat llama].join(' or ') # "dog or cat or llama" 
+0

감사합니다, 당신은 나에게 좋은 출발점을 제공했습니다. –

+0

선택은 내가 필요한 것에 대한 완벽한 방법이었습니다. 자신이 많이 사용하고있는 다른 배열 방법이 있습니까? 전체 배열 문서를 공부할 시간이 없지만 몇 가지 중요한 방법을 연구하고 싶습니다. –

+0

대답을 수락했습니다. 감사. –