在Rails中添加created_at DESC功能

use*_*764 10 ruby ruby-on-rails

我有一个带帖子和评论模型的应用程序.在我的索引操作/视图中,我正在迭代帖子,并将它们从最近创建的时间显示到创建时最早的时间.我的评论嵌套在我的帖子中,所以在我的帖子节目动作/视图中,我想迭代评论并让它们显示从最近创建的到最早创建的.如果我在我的post.rb文件中创建一个方法,我似乎只能让它工作.我有这个:

post.rb:

  def newest_comments
    self.comments.order("created_at DESC")
  end  
Run Code Online (Sandbox Code Playgroud)

在我的帖子展示视图中,我可以遍历帖子评论并且效果很好:

<% @post.newest_comments.each do |comment|
<% end %>
Run Code Online (Sandbox Code Playgroud)

但我想在控制器层中设置此功能,但我无法弄清楚如何.这就是我在帖子控制器中的show动作中所拥有的:

  def index
    @posts = Post.all.order("created_at DESC")
  end

  def show
    @comment = Comment.new
    @comments = Comment.all.order("created_at DESC")
  end
Run Code Online (Sandbox Code Playgroud)

现在我更新的帖子显示视图:

<% @post.comments.each do |comment| %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

@post因为我之前的行动,var就在那里.所以我的问题是,为什么我只能在我的节目视图中调用它来在我的帖子显示视图中访问这个ivar?

Bij*_*jan 15

通过对Rails更新,您可以避免使用created_at DESCSQL语法,如下所示:

@comments = @post.comments.order(created_at: :desc)


jos*_*onc 8

您可以使用范围

class Comment < ActiveRecord::Base
  scope :newest_first, -> { order(created_at: :desc) }
end
Run Code Online (Sandbox Code Playgroud)

然后就像使用它一样

@comments = Comment.newest_first
Run Code Online (Sandbox Code Playgroud)

并且@comments将被订购


air*_*iry 1

您可以在后模型中定义排序:

class Post
  has_many :comments, :order => 'created_at DESC'
  # ...
end
Run Code Online (Sandbox Code Playgroud)