2012-10-26 63 views
4

我正在開發一個rails應用程序,其中Users有很多Items。用戶是geocoded感謝另一個模型,我稱爲Place依靠寶石地理編碼器寶石。geocoder:距離排序索引

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 

現在我想建立在項目,使得它們按距離排序,以當前用戶的索引。我沒有找到設計來執行此設置中的任務。

我試圖做與地理編碼器在User模型near方法的代表團和Item模型,但SQL查詢以下失敗抱怨latitudelongitude不是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

您使用了哪個數據庫? Postgres有一個地理信息模塊,可能有助於解決您的問題。 – dpassage

+0

@dpassage - 我真的在Postgres上。你能否給我提供你提到的模塊的更多信息?這些東西。 – microcosme

+0

幾件事情。有Postgre(http://postgis.refractions.net)爲核心,或標準的Postgres擴展earthdistance(http://www.postgresql.org/docs/9.1/static/earthdistance.html)爲較少的核心。 – dpassage

回答

0

我不知道這是否是太明顯,我還是我錯了,但讓我嘗試:

我剛剛創建一列(例如,位置 - 在項目模型)來保存當前位置該項目,然後將其與當前用戶位置進行比較。

不是你想要的嗎?希望我幫助!