我正在使用Ryan Bates在第273集http://railscasts.com/episodes/273-geocoder?view=asciicast中介绍的Ruby的地理编码器宝石。在那一集中,他使用以下内容搜索半径50公里范围内的对象(尽管他使用的是位置模型,我使用的是用户模型)。
@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)中,他的位置模型上没有距离列(因为我的用户模型没有它)所以我假设distance
是由Geocoder宝石提供的东西。但是,查看地理编码器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):
答案 0 :(得分:1)
您不必指定order: :distance
,默认情况下,结果将按距离排序。
答案 1 :(得分:-1)
在使用Postgres和Geocoder gem时,您的查询无法在查询中使用符号化键(在本例中为:distance
)。在这种情况下使用字符串'distance'可以避免这个问题。
@users = User.near(params[:search], 50, :order => 'distance')
答案 2 :(得分:-1)
试试这个:
User.near(params[:search], 50).reorder("distance asc")
将引号置于引号中,使其不会将其视为表格列。
重新订购(..)重新定义订单。