Breve というモデルで Geocoder gem を使用しています。Geocoder は、基準点の半径のすべての「breves」を含む Relation を返すメソッド near([latitude, longitude], radius) を提供します。breves の 2 つのリストが存在するビューを作成したいと思います。1 つは最終更新時刻の新しい順に並べられ、もう 1 つは特定の参照ポイント (次のコードではパリの中心) への近さに基づいています。
Breve.near(@reference_point,10)
その行をテストすると、関係は実際には基準点から最も近いものから最も遠いものへとソートされます。ただし、コントローラーを介してビューに渡すと、他のリストのように時系列の逆順に表示されます。
私はいくつかのことを試しましたが、今のところ理解できませんでした。コントローラーとビュー、および Breve モデルのコードは次のとおりです。
controllers/static_pages_controller
require 'will_paginate/array'
class StaticPagesController < ApplicationController
def home
@update_ordered = Breve.paginate(page: params[:page])
@reference_point = [48.85, 2.35]
ordered = Breve.near(@reference_point,10)
#binding.pry
@location_ordered = Breve.near(@reference_point,10).paginate(page:
params[:page])
end
def content
end
def contribute
end
end
ビュー views/static_pages/home.html.erb
<div class="span5 pull-left">
<h3>Liste classée par date de dernière modification</h3>
<ul class="list">
<%= render @update_ordered, detail: 'time_update' %>
</ul>
<%= will_paginate @update_ordered %>
</div>
<div class="span5 pull-right">
<h3>Liste classée par distance au centre de Paris</h3>
<ul class="list">
<%= render @location_ordered, detail: 'distance' %>
</ul>
<%= will_paginate @location_ordered %>
</div>
およびモデル models/breve.rb
class Breve < ActiveRecord::Base
attr_accessible :description, :title, :location, :source_name, :source_URL,
:latitude,:longitude
has_paper_trail
reverse_geocoded_by :latitude, :longitude
validates :title, presence: true
validates :title, :length => { :maximum => 100 }
validates :location, :length => { :maximum => 100 }
validates :description, :length => { :maximum => 2000 }
validates :source_name, :length => { :maximum => 100 }
validates :latitude, presence: true
validates :latitude, numericality: true
validates :latitude, :numericality => {
:greater_than => -90,
:less_than => 90
}
validates :longitude, presence: true
validates :longitude, numericality: true
validates :longitude, :numericality => {
:greater_than => -180,
:less_than => 180
}
default_scope order: 'breves.updated_at DESC'
end
end