使用“.order(params [])”和实例方法?

时间:2012-12-04 13:35:57

标签: ruby-on-rails

我有PostReplyVote模型(多态):

 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_votesposts表中添加replies列有点不必要,但不确定这对性能是否更好?)

1 个答案:

答案 0 :(得分: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(请参阅the link_to api doc中的最后一个示例,例如

<%= 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