Rails:重新排序ActiveRecord结果集

时间:2013-08-26 18:03:53

标签: ruby-on-rails

我想按审核日期检索最后五篇文章,但我想按时间顺序(升序)显示它们。我该怎么做?

# controller
@recent_articles = Article.where("reviewed = ?", true).order("review_date DESC").limit(5)

# view
<% @recent_articles.each do |ra| %>
  # articles sorted by review_date in ascending order
<% end %>

我尝试在控制器中执行此操作,但它检索了五个最旧的review_dates(即它只是通过ASC顺序检索记录而不是重新排序已检索的数组):

@recent_articles = Article.where("reviewed = ?", true).order("review_date DESC").limit(5)
@recent_articles = @recent_articles.reorder("review_date ASC")   

2 个答案:

答案 0 :(得分:5)

所以你想要来自DESC查询的文章,但是它们是以相反的顺序从数据库进来的吗?

@recent_articles.reverse!

答案 1 :(得分:3)

我建议您在模型中创建reviewedrecent范围。这将允许您的控制器中具有良好可链接的范围:

# article.rb

scope :reviewed, lambda { where("reviewed = ?", true) }
scope :recent,   lambda { |n| order("review_date").last(n) }

# in your controller..

@recent_articles = Article.reviewed.recent(5)

注意我使用的是last(n),而不是limit。由review_date desc排序只是为了通过审核日期获取最新文章,然后重新排序它们是因为查询错误。除非您出于其他原因使用review_date desc,否则请改用last