2013-07-30 35 views
0

我试图从给定位置附近获得用户的工作。我有用户的经度和纬度(我正在从他们的地址中删除)。搜索附近的位置,国家名称不能与地理编码

现在,当我在寻找一个术语,如“NC”的展示它的一些成果,但是,当我与国名“团结状态”搜索,它必须显示所有的结果,而是它不显示任何结果。

我使用Geocoder宝石这一点。 下面是我在做什么:

控制器:

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

型号:

geocoded_by :address1 

查看:

Displaying all the results returned from @user 

任何想法我应该做的,这样它会返回所有结果,即使我用国家名搜索。

+0

请问,如果你把在更具体的搜索项工作? (纽约例如?) –

+0

@MichaelSzyndel是的,它适用于特定的条款,如果我使用的是邮政编码。 –

+0

那么使用地理编码搜索国家有什么意义? –

回答

1

当地理编码器收到类似“美国”,它将搭载一个单一的中心坐标对,然后从中进行搜索。因此,就您而言,它将在距离美国中心20英里范围内搜索用户。

你想要做什么,是进行地理编码搜索,然后找出它是哪种类型的输入(国家等)

因此,举例来说,在你的控制器:

def search 
    search = Geocoder.search(params[:search]).first 

    if search.types.includes?('country') 
    @users = User.where(country: search.address) 
    else 
    @users = User.near(search.coordinates, 20) # Will be ordered by distance by default 
    end 
end 

您必须将地址组件存储在数据库中。

有一致的数据,最好的方法是运行一个自定义的地理编码回调:

class User < ActiveRecord::Base 
    geocoded_by :address do |obj, results| 
    if result = results.first 
     obj.street = result.street_address 
     obj.zip = result.postal_code 
     obj.city = result.city 
     obj.country = result.country 
     obj.latitude = result.latitude 
     obj.longitude = result.longitude 
    end 
    end 

    after_validation :geocode, if: :address_changed? 

    def address 
    "#{street}, #{zip} #{city}, #{country}" 
    end 

    def address_changed? 
    street_changed? || city_changed? || zip_changed? || country_changed? 
    end 
end 
0

通过@delba接受的答案是伟大的,只有一个小错字,那就是,Ruby没有:includes?数组的谓词,但:include?。 所以它应该是search.types.include?('country')

+0

其实更多的是评论,但 - - 。 – cramopy

+0

事情是我需要更多的点实际上能够写评论,我不能做一个字母的编辑请求,所以我认为你理解我的场景:) –

相关问题