按时间desc和total_votes渲染帖子

时间:2015-02-09 05:41:35

标签: ruby-on-rails ruby algorithm ruby-on-rails-4

如果没有投票或相同的投票,按时间desc排序,我想在此帖子中首先通过total_votes呈现Feed中的帖子,这意味着新帖子将更高。我的尝试代码在这里。

def feed
  microposts = Micropost.where("created_at >= ? ", 30.minutes.ago).order('created_at desc')
end

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render @feed_items.sort_by { |post| post.total_votes }.reverse%>
  </ol>
   <%= will_paginate @feed_items %>
<% end %>

编辑:

很抱歉,total_votes只是我的Micropost模型中的一种方法。

Micropost模型

  class Micropost < ActiveRecord::Base
     has_many :votes, as: :voteable
     ...

     def total_votes
       self.up_votes - self.down_votes
     end

     def up_votes
       self.votes.where(vote: true).size
     end

     def down_votes
       self.votes.where(vote: false).size
     end

再次抱歉.-。

编辑2:

http://i.stack.imgur.com/Fgx3J.png

3 个答案:

答案 0 :(得分:1)

我认为total_votes是数据库中的一列。

Micropost.where('created_at >= ?', 30.minutes.ago).
  order('total_votes DESC, created_at DESC')

答案 1 :(得分:1)

如果我理解正确,您希望首先按投票数进行排序,如果投票数相同,那么您希望按created_at排序。

def feed
  @feed_items = Micropost.where("created_at >= ? ", 30.minutes.ago).order('total_votes desc, created_at desc')
end

然后,您可以直接在视图中使用它。

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>

答案 2 :(得分:0)

其他答案是正确的,但为了好玩,您还可以在视图中对其进行排序。

变化:

@feed_items.sort_by { |post| post.total_votes }

要:

@feed_items.sort { |x,y| if x.total_votes < y.total_votes; 1 elsif x.total_votes == y.total_votes; y.created_at <=> x.created_at else; -1 end } %>