0

私の場合、モデルProducthas_oneLocationがあります

ジオコーダージェムを使用して、離れた場所の場所を検索します。

リクエストLocation.near([0、0]、100)は次のようになります。

SELECTの場所。*、6371.0 * 2 * ASIN(SQRT(POWER(SIN((0-locations.latitude)* PI()/ 180/2)、2)+ COS(0 * PI()/ 180)* COS( location.latitude * PI()/ 180)* POWER(SIN((1-locations.longitude)* PI()/ 180/2)、2)))AS距離、CAST(DEGREES(ATAN2(RADIANS(longitude-1 )、RADIANS(latitude-0)))+ 360 AS decimal)%360 AS Bearing FROM \ "locations \" WHERE(6371.0 * 2 * ASIN(SQRT(POWER(SIN((0 --locations.latitude)* PI() / 180/2)、2)+ COS(0 * PI()/ 180)* COS(locations.latitude * PI()/ 180)* POWER(SIN((1-locations.longitude)* PI()/ 180 / 2)、2)))<= 20)距離で注文

私はこのようなことをしたい:

Product.where(...).joins(:location).dosomething

どうすればいいですか?

4

2 に答える 2

0

スコープのマージが機能しないように見えるため、別の可能性があります。

class Product
  scope :near, lambda { |coord, dist| where(:id => Location.near(coord, dist).all.map(&:locationable_id) }

  ...
end

そして、他の答えのような使い方:

Product.near([0, 0], 100)
于 2012-04-13T13:04:48.013 に答える
0

Location#near名前付きスコープですか?その場合は、演算子Productを使用してスコープとマージできます。&私はこれがうまくいくと思います:

class Product
  scope :near, lambda { |coord, dist| joins(:location) & Location.near(coord, dist) }

  ...
end

次に、次のように使用できます。

Product.near([0, 0], 100)
于 2012-04-13T10:52:30.720 に答える