I가 다음 쿼리중첩 SQL 쿼리
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
나는 각각 수행하여 위의 쿼리의 선택에 다른 SQL 쿼리를 실행할 수있는 방법이 있나요? 지정된 거리 밖에있는 특정 목록을 삭제하기 위해 geokit 계산을 실행하고 싶습니다 ...
I가 다음 쿼리중첩 SQL 쿼리
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
나는 각각 수행하여 위의 쿼리의 선택에 다른 SQL 쿼리를 실행할 수있는 방법이 있나요? 지정된 거리 밖에있는 특정 목록을 삭제하기 위해 geokit 계산을 실행하고 싶습니다 ...
약간의 혼란이 있습니다. 필터링을하기 위해 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
으로 지정해야합니다. 제어기 인스턴스 변수 (로컬 인스턴스가 아닌) 만보기에 액세스 할 수 있기 때문입니다.
간단히 말해서, 아니오. 이는 초기 쿼리 이후에 관계형 테이블이나 뷰가 남지 않았기 때문에 activerecord 객체의 배열이 남아 있기 때문입니다. 따라서 초기 쿼리 이후에 수행되는 모든 처리는 sql이 아닌 ruby 및 activerecord 형식이어야합니다.
내 문제는, distance_from이 루비 함수이기 때문에'WHERE location1.distance_from (location2, : units => : miles) <50'이고 SQL에서 그렇게 할 수 없다는 것입니다. – Lisa
하하 죄송합니다 - 우연히 들어 와요. – Lisa
내 편집을 참조하십시오. 그러나 좀 더 구체적인 것은 여전히 먼 길을 갈 것입니다. 원래 게시물을 참조하여 location1과 location2는 무엇입니까? – diedthreetimes