使用Rails中的Geocoder对ActiveRecord关系进行排序

时间:2013-01-25 23:31:42

标签: ruby-on-rails-3 sorting rails-activerecord rails-geocoder

我正在使用Geocoder gem和一个名为Breve的模型。 Geocoder提供了一种靠近([纬度,经度],半径)的方法,返回一个包含所有" breves"在参考点的半径内。我想创建一个视图,其中将有2个breve列表,1个按其上次更新时间的反向时间顺序排序,1个基于与给定参考点的接近度(在下面的代码中,它是巴黎的中心)。

Breve.near(@reference_point,10)

当我测试该线时,Relation实际上是从距离参考点最近到最远的breve排序的。但是,当我通过控制器将其传递给视图时,它会按照与其他列表相反的时间顺序显示。

我尝试了几件事,但到目前为止我无法弄明白。下面是控制器和视图的代码,以及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

查看视图/ 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>

和模型模型/ 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

0 个答案:

没有答案