2011-07-26 5 views
0

I가 다음 쿼리중첩 SQL 쿼리

@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry]) 

나는 각각 수행하여 위의 쿼리의 선택에 다른 SQL 쿼리를 실행할 수있는 방법이 있나요? 지정된 거리 밖에있는 특정 목록을 삭제하기 위해 geokit 계산을 실행하고 싶습니다 ...

답변

0

약간의 혼란이 있습니다. 필터링을하기 위해 each..do (ruby)를 사용하고 싶습니까? 또는 SQL 쿼리를 사용 하시겠습니까? 여기에 당신이 당신의 Listing.find_by_sql 전화로 (아마도 하위 선택) 단순히 추가 SQL을 추가 할 수 있습니다 그것을 SQL을 사용하고 싶다면 루비 프로세스가 필터링

refined list = @initial_matches.map { |listing| 
    listing.out_of_bounds? ? nil : listing 
}.comact 

을 할 수있는 방법입니다.

의견에서 말하고 싶은대로하려면.

WHERE location1.distance_from (LOCATION2 : 단위 => : 마일)

당신은 루비 (location1.distance_from(location2, :units=>:miles)) 및 SQL (WHERE X > 50)를 혼합하고 있습니다. 이것은 어렵지 만 불가능하지 않습니다.

그러나 루비에서 거리 계산을 이미 수행해야하는 경우 필터링을 수행하는 것이 좋습니다. 그래서 첫 번째 예를 들어 보겠습니다.

listing2 = some_location_to_filter_by 
@refined_list = @initial_matches.map { |listing| 
    listing.distance_from(listing2) > 50 ? nil : listing 
}.compact 

이렇게하면 미리 지정된 목록에서 50 개가 넘는 항목 만 반복하여 모든 목록을 반복합니다.

EDIT : 제어기에서이 로직을 완료 한 경우 refined_list 대신 @refined_list으로 지정해야합니다. 제어기 인스턴스 변수 (로컬 인스턴스가 아닌) 만보기에 액세스 할 수 있기 때문입니다.

+0

내 문제는, distance_from이 루비 함수이기 때문에'WHERE location1.distance_from (location2, : units => : miles) <50'이고 SQL에서 그렇게 할 수 없다는 것입니다. – Lisa

+0

하하 죄송합니다 - 우연히 들어 와요. – Lisa

+0

내 편집을 참조하십시오. 그러나 좀 더 구체적인 것은 여전히 ​​먼 길을 갈 것입니다. 원래 게시물을 참조하여 location1과 location2는 무엇입니까? – diedthreetimes

0

간단히 말해서, 아니오. 이는 초기 쿼리 이후에 관계형 테이블이나 뷰가 남지 않았기 때문에 activerecord 객체의 배열이 남아 있기 때문입니다. 따라서 초기 쿼리 이후에 수행되는 모든 처리는 sql이 아닌 ruby ​​및 activerecord 형식이어야합니다.