如何解决哈希中的多个属性sort_by
我希望能够对帖子进行排序
- created_at asc(并包括距离)
- 投票数说明(包括距离)
- 距离升序
到目前为止,我已经能够按距离排序,但是我在弄清楚如何构造地图时仍然遇到困难,仍然无法使distance
对数组中的用户可见(即使他们已选择按vote_count
进行排序)
用户从视图中调用update_order
def update_order
@order = params[:order]
@posts = Post.all
get_distance_posts
end
确定距离的方法:
def get_distance_posts
posts = {}
@posts.map{ |post| posts[post.id] = (check_coordinates_present?(post,current_user) ? get_users_distance(post,current_user) : 0 ) }
@sorted_posts = Hash[*posts.sort_by {|_key,value| value}.flatten]
end
我的view.html.erb
<% @sorted_posts.map do |u_id,dist| %>
<% post = @posts.find(u_id) %>
<p> <%= post.created_at %> </p>
<p> <%= post.vote_count %> </p>
<p><%= dist %></p>
<% end%>
任何帮助将不胜感激!
解决方法
首先,您不应该在Ruby中进行订购。您将从数据库中提取所有记录,服务器将开始出现严重的性能问题,并最终在应用扩展时崩溃,因为它将耗尽可用内存。
相反,您想使用.order
,它会向查询中添加一个order子句以对结果进行排序。
Post.near([48.848903,2.354533])
.order(
created_at: :asc,vote_count: :desc
)
这允许您将分页和限制应用于查询,以防止上述内存问题。
.near
是Geocoder gem提供的特殊作用域,它选择两个特殊的计算地理空间列-distance
和bearing
。它也按距离排序。
这里我使用的是一组静态坐标,但是您可以传递模型中的一组坐标,甚至可以传递经过地理编码的地址:
# to_coordinates is provided by Geocoder
Post.near(user.to_coordinates)
.order(
created_at: :asc,vote_count: :desc
)
Post.near("Beijing")
.order(
created_at: :asc,vote_count: :desc
)
如果您想选择距离而不是用于订购,请使用.reorder
代替查询的订购条款:
Post.near(user.to_coordinates)
.reorder(
created_at: :asc,vote_count: :desc
)
,
选项1:使用presenter object。为每个帖子创建一个演示者,让演示者计算距离并将其存储在自己中,对演示者(而不是帖子)进行排序,渲染演示者。
选项2:在地图上存储从帖子ID到距离的距离。渲染帖子时,请在帖子ID-距离地图中查找相应的距离。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。