我对“帖子”的排序方式不同,具体取决于用户是否点击了“趋势”,“新”或“顶部”。
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
的内容。
答案 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'