地理编码器:距离可排序索引

时间:2012-10-26 20:17:24

标签: ruby-on-rails oop geocoding rails-geocoder

我正在开发一个导航应用,其中Users有很多Items。由于我称之为Place的另一个模型依赖于红宝石地理编码器宝石,因此对用户进行了地理编码。

class Place < ActiveRecord::Base
    attr_accessible :street_number, :street, :city, :postal_code, :country, :latitude, :longitude

    belongs_to :placable, :polymorphic => true
    geocoded_by :address
    after_validation :geocode

    def address
       [street_number, street, postal_code, city, country].compact.join(', ')
   end
 end

在用户模型中,我委派了Place模型中的方法,以便能够直接在用户级别访问它们。

class User < ActiveRecord::Base
  has_many :items, :dependent => :destroy
  has_one  :place, :as => :placable, :dependent => :destroy
  accepts_nested_attributes_for :place
  attr_accessible :place_attributes

  geocoded_by :address
  delegate :address, :to => :place, :allow_nil => true
  delegate :latitude, :to => :place, :allow_nil => true
  delegate :longitude, :to => :place, :allow_nil => true
  #...
end

在项目级别使用相同的技巧:

class Item < ActiveRecord::Base
  belongs_to :user

  # place
  geocoded_by :address
  delegate :place, :to => :user, :allow_nil => true 
  delegate :address, :to => :user, :allow_nil => true
  delegate :latitude, :to => :user, :allow_nil => true
  delegate :longitude, :to => :user, :allow_nil => true
  # ...
end

现在我想设置一个项目索引,使它们按距离排序到当前用户。我没有找到在此设置中执行任务的设计。

我尝试在near模型和User模型上使用地理编码器中Item方法的委派来执行以下操作,但是sql查询无法抱怨latitude并且longitude不是items表的列。这实际上是正确的,但我希望改为访问places表中的那些。

  # this added to the user model:
  delegate :near :to => :place
  # this added to the item model:
  delegate :near :to => :user

  class ItemsController < ApplicationController

    def index
       @items=Item.near(current_user.place, params[:distance]).paginate(:per_page => 20, :page => params[:page_name])
    end
  end

我想避免解决方案,其中用户和项目都具有地理编码属性(纬度,经度,地址等)。

1 个答案:

答案 0 :(得分:0)

我不知道这对我来说是否太明显或者我错了,但请允许我试试:

我只是创建一个列(例如,位置 - 在项目模型中)以保存项目的当前位置,然后将其与当前用户位置进行比较。

不是你想找的?希望我帮忙!