多く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
のジオコーダーからのメソッドの委任で次のことを試みましたが、SQLクエリは失敗し、テーブルの列ではありません。これは実際には正しいのですが、代わりにテーブル内のものにアクセスしたいと考えています。User
Item
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
ユーザーとアイテムの両方がジオコーディング用の属性 (緯度、経度、住所など) を持つソリューションは避けたいと思います。