【问题标题】:Geokit and rails 3Geokit 和导轨 3
【发布时间】:2010-08-12 23:06:12
【问题描述】:

我正在使用带有 rails 3 的 geokit gem 和插件。它们似乎存在一个已知问题,可以在此处查看 http://github.com/andre/geokit-rails/issues#issue/15

现在,我尝试按照底部提供的解决方案进行操作。我将该函数定义粘贴在文件末尾,就在acts_as_mapable 上方,就在第一次调用它之后,但每次都没有发生任何事情。

知道还能做什么吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails geokit


    【解决方案1】:

    我在将应用程序升级到 rails 3 时遇到了类似的问题。我仍在使用 Geokit 进行地理编码,但使用 Active Record 范围进行基于距离的数据库查询。这非常方便,而且您仍然可以获得 Active Record 3 的所有优点。这是我的用户模型中的一个示例:

    scope :near, lambda{ |*args|
                      origin = *args.first[:origin]
                      if (origin).is_a?(Array)
                        origin_lat, origin_lng = origin
                      else
                        origin_lat, origin_lng = origin.lat, origin.lng
                      end
                      origin_lat, origin_lng = deg2rad(origin_lat), deg2rad(origin_lng)
                      within = *args.first[:within]
                      { 
                        :conditions => %(
                          (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+
                          COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+
                          SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) <= #{within}
                        ),
                        :select => %( users.*,
                          (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+
                          COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+
                          SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) AS distance
                        )
                      }
                    }
    

    这是一篇关于该主题的更详细的博文:http://stcorbett.com/code/distance-queries-with-rails-3-without-geokit/

    【讨论】:

    • 有用的博文 stcorbett。从数据库返回距离很方便,并且可链接范围很好。我提醒一下,新字段将出现在 User 模型上(在这种情况下),您可能希望命名该字段以表明它不是用户的永久属性,而是与另一个用户的距离..
    • 啊,有趣的一点。我可以看到根据查询计算距离的用户来命名新属性。例如:“distance_to_user_#{origin.id}”。当您想使用距离数据时,这为您提供了一个额外的跳跃。好东西。
    【解决方案2】:

    jlecour's port to rails 3 应该可以解决您去年遇到的任何问题。

    如果您在进行距离计算,请确保您使用的是 mysql 或 postgres。

    【讨论】:

      【解决方案3】:

      在 Rails 3.1 上安装 geokit-rails3 gem 遇到问题后,我搬到了geocoder gem。它也有距离计算(一定不要忘记@your_model.nearby*s*(5) 中的 s)。还有一个Railscast

      【讨论】:

        【解决方案4】:

        这是 geokit 到 rails 3 的端口,不完整:

        https://github.com/jlecour/geokit-rails3

        【讨论】:

          【解决方案5】:

          对于那些仍然遇到 geokit 问题的人,我继续使用 mongodb...它具有内置的距离搜索 n all...

          【讨论】:

            【解决方案6】:

            嘿,阿米特,不确定你是否解决了这个问题,但我会告诉你我做了什么以防万一。

            我分叉了 andre 的 geokit-rails 源代码,然后将其克隆到本地,并在 lib/geokit-rails/acts-as-mappable.rb34 行添加了来自 this gist 的代码,就在读取为 module ClassMethods # :nodoc: 的行之后。

            然后我将这些更改提交回我在 github 上的分叉存储库,并使用我的 fork 将源代码作为插件安装到我的 rails 3 应用程序中。这似乎可以立即工作,但请确保您已将 acts_as_mappable 行添加到您想要进行距离计算的任何模型中,并确保您在名为 @987654326 的数据库上有两个 float 列@和:lng

            【讨论】:

            • 嘿!是的,那行得通,但是由于某种原因,该插件无法与 rails 3 nemore 一起使用...所以我只是制作了自己的插件;)
            猜你喜欢
            • 1970-01-01
            • 2011-08-15
            • 2011-07-18
            • 1970-01-01
            • 1970-01-01
            • 2011-07-20
            • 1970-01-01
            • 2012-06-21
            • 1970-01-01
            相关资源
            最近更新 更多