1

我有一个Post,Reply和一个Vote模型(多态):

 create_table "posts", :force => true do |t|
    t.text     "content",       :limit => 255
    t.integer  "user_id"
    t.datetime "created_at",                                  :null => false
    t.datetime "updated_at",                                  :null => false
    t.string   "title"
    t.integer  "replies_count",                :default => 0, :null => false
    t.integer  "category_id"
  end

  create_table "replies", :force => true do |t|
    t.text     "content"
    t.integer  "post_id"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "votes", :force => true do |t|
    t.integer  "votable_id"
    t.string   "votable_type"
    t.integer  "user_id"
    t.integer  "polarity"
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
  end

我需要total_votes帖子和回复,所以我创建了一个实例方法:

post.rb 和 reply.rb:

  def total_votes
    self.votes.map {|v| v.polarity }.sum
  end

所以我可以用它来对帖子和回复进行排序:

主页:

 default_order = "created_at DESC"
 params[:order_by] ||= default_order
 @feed_items = @post.replies.paginate(page: params[:page],
                                      per_page: 10).order(params[:order_by])

所以现在,我不太确定order_by在视图中添加了什么:

  <span><%= link_to 'total_votes DESC', root_path(order_by: HERE) %></span>

我试过&:total_votes DESCtotal_votes DESC没有奏效。

这样做的正确方法是什么?(我认为向和表中添加total_votes列有点不必要,但不确定这是否对性能更好?)postsreplies

4

1 回答 1

2

我将从使用数据库为您求和开始,但这有点棘手,因为您需要按计算的值(“聚合”)进行排序,但让我们把它放在一边。

您的视图将按照在控制器中设置实例变量时确定的顺序显示项目。所以在控制器中,您可能会检测到有一个order_by参数(例如/feed?order_by=total_votes,并相应地加载@feed_items,例如

def index
  if params[:order_by] && params[:order_by] == 'total_votes'
    sort_order = "total_votes DESC"
  else
    sort_order = "created_at DESC"
  end
  @feed_items = @post.replies.paginate(page: params[:page],
                                  per_page: 10).order(sort_order)
end

然后在您看来,要更改排序顺序,请创建一个link_to添加查询字符串参数的函数(请参见link_to api 文档中的最后一个示例,例如

<%= link_to "Sort by Total Votes", root_path(:order_by => 'total_votes') %><br />
<%= link_to "Sort by Time", root_path %><br />

您的另一个问题是关于如何按投票进行排序。这个答案可能会为此提供一个良好的开端,并回答您的性能问题:Rails: Order by sum of two columns

于 2012-12-04T13:56:21.860 回答