8

我正在使用 Ryan Bates 在第 273 集http://railscasts.com/episodes/273-geocoder?view=asciicast中介绍的 Ruby 地理编码器 gem 。在那一集中,他使用以下方法搜索半径 50 公里内的对象(尽管他使用的是 Location 模型,而我使用的是 User 模型)。

 @users = User.near(params[:search], 50, :order => :distance)

当我在带有 postgres 的 Rails 4 应用程序上运行此代码时,它说

PG::Error: ERROR:  column users.distance does not exist

在 Ryan 的演示应用程序(此处代码https://github.com/railscasts/273-geocoder/tree/master/siteseer-after)中,他的 Location 模型上没有距离列(因为我没有它)我的用户模型)所以我认为这distance是由 Geocoder gem 提供的。但是,查看地理编码器的文档http://rdoc.info/github/alexreisner/geocoder/master/frames,没有distance方法,所有其他类似距离的方法都会产生相同的错误。

有谁知道我如何按距离对查询结果进行排序?

更新在地理编码器主页http://www.rubygeocoder.com/上,它给出了使用的示例distance,但是当我尝试它时,它说它对用户不存在。

nearbys = Place.near("Omaha, NE", 50,
  :order => "distance")
bearing = nearbys.first.bearing # => 46.12
Geocoder::Calculations.compass_point(
  bearing) # => "NE"

更新

这是生成的sql

ActionView::Template::Error (PG::Error: ERROR:  column users.distance does not exist
LINE 1: ...ngitude) * PI() / 180 / 2), 2))) <= 50)  ORDER BY "users".di...
                                                             ^
: SELECT users.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI() / 180 / 2), 2) + COS(43.7058645 * PI() / 180) * COS(users.latitude * PI() / 180) * POWER(SIN((-79.3687137 - users.longitude) * PI() / 180 / 2), 2))) AS distance, CAST(DEGREES(ATAN2( RADIANS(users.longitude - -79.3687137), RADIANS(users.latitude - 43.7058645))) + 360 AS decimal) % 360 AS bearing FROM "users"  WHERE (users.latitude BETWEEN 42.98220558444576 AND 44.429523415554236 AND users.longitude BETWEEN -80.36976846878524 AND -78.36765893121476 AND 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI() / 180 / 2), 2) + COS(43.7058645 * PI() / 180) * COS(users.latitude * PI() / 180) * POWER(SIN((-79.3687137 - users.longitude) * PI() / 180 / 2), 2))) <= 50)  ORDER BY "users".distance ASC):
4

3 回答 3

1

您不必指定order: :distance,默认情况下,结果将按距离排序。

于 2013-09-05T22:48:10.073 回答
-1

将 Postgres 与Geocoder gem一起使用时,您的查询不能在查询中使用符号化键(在本例中:distance为 )。在这种情况下使用字符串“距离”可以避免这个问题。

@users = User.near(params[:search], 50, :order => 'distance')
于 2014-03-17T13:43:39.903 回答
-1

尝试这个:

    User.near(params[:search], 50).reorder("distance asc")

将排序放在引号中,这样它就不会将其视为表格列。

reorder(..) 重新定义顺序。

于 2014-07-13T00:19:19.907 回答