干掉只会改变其顺序的查询

时间:2014-08-12 03:21:52

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

我对“帖子”的排序方式不同,具体取决于用户是否点击了“趋势”,“新”或“顶部”。

case params[:sort_type]
when "trending"
  @posts = Post.order("trending_score DESC").limit(30)
when "new"
  @posts = Post.order("created_at DESC").limit(30)
when "top"
  @posts = Post.order("total_votes DESC").limit(30)
end

有很多重复的代码,但我不确定如何分解order的内容。

1 个答案:

答案 0 :(得分:4)

一种方法就是:

CHOSEN_ATTRIBUTES = {'trending' => 'trending_score', 'new' => 'created_at', 'top' => 'total_votes'} #this could be a constant up in the class
chosen_attr = CHOSEN_ATTRIBUTES[params[:sort_type]] 
@posts = Post.order("#{chosen_attr} DESC").limit(30)

另一种方法是使用参数创建一个范围。在你的模型中:

CHOSEN_ATTRIBUTES = {'trending' => 'trending_score', 'new' => 'created_at', 'top' => 'total_votes'}

scope :order_query_by, lambda {|attr| order("#{CHOSEN_ATTRIBUTES[attr]} DESC").limit(30)}

然后,每当您想要根据属性进行呼叫时,请使用:

Post.order_query_by 'trending'