0

就我而言,我有一个模型产品 has_one 位置

我使用地理编码器 gem 来搜索距离较近的位置。

请求 Location.near([0, 0], 100) 如下所示:

选择位置。*, 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) )) 作为距离,CAST(DEGREES(ATAN2( RADIANS(longitude - 1) ), RADIANS(latitude - 0))) + 360 AS 十进制) % 360 AS 方位来自“位置” 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 回答