反向显示博客条目和评论,Ruby on Rails

我是rails的新手,所以可以在这里使用一些帮助。 我已经按照几个教程创建了一个带有评论的博客,甚至还有一些AJAX的铃声和口哨,而且我坚持一些我希望很容易的东西。 博客和评论的默认显示是列出最早的第一个。 如何将其反转以显示最新条目和最新评论。 不知道这是否是控制器或型号的function。 我做了一些自定义,所以这里是控制器.rb文件的代码,如果它有帮助。

评论控制器

class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.create!(params[:comment]) respond_to do |format| format.html { redirect_to @post} format.js end end end 

POSTS控制器

 class PostsController  [:index, :show] # GET /posts # GET /posts.xml def index @posts = Post.all(:include => :comments) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @posts } format.json { render :json => @posts } format.atom end end # GET /posts/1 # GET /posts/1.xml def show @post = Post.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @post } end end # GET /posts/new # GET /posts/new.xml def new @post = Post.new respond_to do |format| format.html { redirect_to @post} format.js end end # GET /posts/1/edit def edit @post = Post.find(params[:id]) end # POST /posts # POST /posts.xml def create @post = Post.new(params[:post]) respond_to do |format| if @post.save flash[:notice] = 'Post was successfully created.' format.html { redirect_to(@post) } format.xml { render :xml => @post, :status => :created, :location => @post } else format.html { render :action => "new" } format.xml { render :xml => @post.errors, :status => :unprocessable_entity } end end end # PUT /posts/1 # PUT /posts/1.xml def update @post = Post.find(params[:id]) respond_to do |format| if @post.update_attributes(params[:post]) flash[:notice] = 'Post was successfully updated.' format.html { redirect_to(@post) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @post.errors, :status => :unprocessable_entity } end end end # DELETE /posts/1 # DELETE /posts/1.xml def destroy @post = Post.find(params[:id]) @post.destroy respond_to do |format| format.html { redirect_to(posts_url) } format.xml { head :ok } end end private def authenticate authenticate_or_request_with_http_basic do |name, password| name == "admin" && password == "secret" end end end 

正如jtbandes所指出的,要反转索引中的post,您需要将索引操作中的行更改为:

 @posts = Post.all(:include => :comments, :order => "created_at DESC") 

为了颠倒您的评论列表,有两种可能性。

选项1:在您的post模型中,您可以声明您的关系:

 class Post < ActiveRecord::Base has_many :comments, :order => "created_at DESC" end 

选项2:在索引视图中,只需在显示每个post的注释之前反转它们的数组:

 <% @posts.each do |post| %> <%= render :partial => post %> <%= render :partial => post.comments.reverse %> <% end %> 

选项有不同的用例。 在选项1中,您说在整个应用程序中,只要您在post上引用注释,就应该按照指定的顺序从数据库中检索这些注释。 你有点说这是你的应用程序中注释的内在属性 – post有很多注释,默认情况下是最新的。

在选项2中,您只需在呈现之前撤消索引页面中的注释。 它们仍然以原始顺序(最早的第一个)从数据库中检索,并且在您访问应用程序中post的注释的任何其他位置它们仍然会以该顺序出现。

如果您正在寻找一种更通用的方法来反转.each方法的顺序,Rails会使用.reverse_each方法。 像这样:

 <% @posts.reverse_each do |post| %> <%= render :partial => post %> <%= render :partial => post.comments.reverse %> <% end %> 
 @posts = Post.find(:all, :include => :comments, :order => "published_at DESC") 

看起来您可以使用find来反转顺序:类似Post.find(:all, :order => "created_at DESC") 。 同样适用于评论。

.reverse_each方法与will_paginate碰撞

这是解决方案

 @posts = Post.all.paginate(:order => "created_at DESC",:page => params[:page],:per_page => 5) 

尝试使用: reverse_order

 Client.where("orders_count > 10").order(:name).reverse_order 

这将执行SQL:

 SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC 

如果查询中未指定排序子句,则reverse_order按相反顺序按主键排序。

 Client.where("orders_count > 10").reverse_order 

将执行:

 SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC 

http://edgeguides.rubyonrails.org/active_record_querying.html#reorder