我正在开发一个导航应用,其中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
我想避免解决方案,其中用户和项目都具有地理编码属性(纬度,经度,地址等)。
答案 0 :(得分:0)
我不知道这对我来说是否太明显或者我错了,但请允许我试试:
我只是创建一个列(例如,位置 - 在项目模型中)以保存项目的当前位置,然后将其与当前用户位置进行比较。
不是你想找的?希望我帮忙!