为`:order`创建一个可以覆盖的默认值?

时间:2012-03-12 11:26:39

标签: ruby-on-rails

我想为:order创建一个默认值:

class Comment < ActiveRecord::Base
  default_scope :order => 'total_votes DESC'

我也让用户对评论进行排序:

posts_controller.rb:

@posts = current_user.subscribed_posts.paginate(:page => params[:page],
                                                :per_page => 5,
                                                :order => params[:order_by])

帖/ show.html.erb:

<span><%= link_to 'Date (DESC)', post_path(@post, :order_by => "created_at DESC") %></span>
<span><%= link_to 'Date (ASC)', post_path(@post, :order_by => "created_at ASC") %></span>
<span><%= link_to 'Votes', post_path(@post, :order_by => "total_votes DESC") %></span>

我按哪个链接并不重要,default_scope没有被覆盖(无论如何都保持total_votes DESC。)

这是默认行为吗?如果是这样,对于这种情况,什么是正确的解决方案? (我希望:order有一个默认值,但只要点击:order_by中的链接,就可以将其更改为show.html.erb的值。

1 个答案:

答案 0 :(得分:1)

你是否在Rails 3上?如果是这样,你想要reorder(params[:order_by])except(:order).order(:order_by) - 前者在某一时刻被弃用(但我认为不推荐),后者在其中一个Rails版本中有一个默认作用域的bug,但我忘记了哪一个。

所以: @posts = current_user.subscribed_posts.reorder(params[:order_by]).paginate(:page => params[:page], :per_page => 5) 应该做的。