2

Rails 4.2와 Postgres 사용하기 Sightings 테이블에 각 새에 대한 관찰 횟수로 주문 된 새 ID의 일원 목록을 제공하기 위해 다음 쿼리를 만들었습니다. 또한 나는 페이지 매김을 위해 카미나리 보석을 사용하고 있습니다.countg에 의해 postgres 그룹을 결합하는 방법

Sighting.select("bird_id, COUNT(sightings.id) as sightings_count").group(:bird_id).order('sightings_count DESC').page(1) 

이렇게하면 ActiveRecordRelation이 의도 한대로 잘 돌아갑니다. 반드시 열 "sightings.id"ERROR : 내가

Sighting.near([-31.0, 151.0], 1000, units: :km).select("bird_id, COUNT(sightings.id) as sightings_count").group(:bird_id).order('sightings_count DESC').page(1) 

이것은

SELECT sightings.*, 6371.0 * 2 * ASIN(SQRT(POWER(SIN((-31.0 - sightings.lat) * PI()/180/2), 2) + COS(-31.0 * PI()/180) * COS(sightings.lat * PI()/180) * POWER(SIN((151.0 - sightings.lng) * PI()/180/2), 2))) AS distance, MOD(CAST((ATAN2(((sightings.lng - 151.0)/57.2957795), ((sightings.lat - -31.0)/57.2957795)) * 57.2957795) + 360 AS decimal), 360) AS bearing, bird_id, COUNT(sightings.id) as sightings_count FROM "sightings" WHERE (sightings.lat BETWEEN -39.993216059187304 AND -22.006783940812696 AND sightings.lng BETWEEN 140.50821379697885 AND 161.49178620302115 AND (6371.0 * 2 * ASIN(SQRT(POWER(SIN((-31.0 - sightings.lat) * PI()/180/2), 2) + COS(-31.0 * PI()/180) * COS(sightings.lat * PI()/180) * POWER(SIN((151.0 - sightings.lng) * PI()/180/2), 2)))) BETWEEN 0.0 AND 1000) GROUP BY bird_id ORDER BY distance ASC, sightings_count DESC LIMIT 25 OFFSET 0 

PG :: GroupingError 쿼리 및 오류를 생성 .near 방법 지오 코더 보석와 결합 할 때 문제가 발생합니다 GROUP BY 절에 나타나거나 집계 함수에 사용됩니다.

그룹에 ID를 추가하면 조류 개수가 정확하지 않고 select 내에서 COUNT를 이해하는 한 sightings.id를 포함하는 집계 함수가됩니다. .

어떻게 둘을 성공적으로 결합 할 수 있습니까?

참고 : 다음을 시도했지만이 것은 AR 관계가 아니라 해시를 반환합니다.

Sighting.near([@lat, @lng], @range, units: :km, order:nil).group(:bird_id).order('count_id DESC').page(@page).count(:id) 

어떤 도움을 주셔서 감사합니다 !!

+0

문제는 geocoder' 당신은'사용 GROUP BY' (그리고 위의 오류가 발생합니다) 경우 모두 의미가 distance' BY'SELECT' 열 및 'ORDER를 생성'입니다 - 내가하지 않은 이것을 끄기 위해 무엇이라도 발견했다. 지오 코더의 github 페이지에있는 [알려진 문제] (https://github.com/alexreisner/geocoder#known-issue) 섹션에서도 유사한 내용이 언급됩니다. – pozs

답변

1

범위 근처에 사용자 정의를 작성하는 것이 각 레코드에 추가되는 베어링 또는 거리 속성을 사용하지 않아서 근처에서 생성 된 전체 select SQL을 필요로하지 않으므로 가장 쉬운 방법이었습니다. select (options [: select]) 대신 원하는 필자로 바꿨습니다.

scope :birds_by_sighting, lambda{ |location, *args| 
latitude, longitude = Geocoder::Calculations.extract_coordinates(location) 
if Geocoder::Calculations.coordinates_present?(latitude, longitude) 
    options = near_scope_options(latitude, longitude, *args) 
    select("bird_id, COUNT(sightings.id) as sightings_count").group(:bird_id).where(options[:conditions]).order('sightings_count DESC') 
else 
    # If no lat/lon given we don't want any results, but we still 
    # need distance and bearing columns so you can add, for example: 
    # .order("distance") 
    select(select_clause(nil, null_value, null_value)).where(false_condition) 
end 
}