4

多くUsersItems. 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のジオコーダーからのメソッドの委任で次のことを試みましたが、SQLクエリは失敗し、テーブルの列ではありません。これは実際には正しいのですが、代わりにテーブル内のものにアクセスしたいと考えています。UserItemlatitudelongitudeitemsplaces

  # 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

ユーザーとアイテムの両方がジオコーディング用の属性 (緯度、経度、住所など) を持つソリューションは避けたいと思います。

4

1 に答える 1