【问题标题】:How do I rearrange order of comments?如何重新排列评论的顺序?
【发布时间】:2014-09-14 20:03:58
【问题描述】:

我正在做一个评论系统,它有点乱。当我需要它以相反的顺序(最新在顶部)时,它会从旧到新列出 cmets。我该怎么做?

代码:(/app/views/cmets/_comment.html.erb)

<%= div_for comment do %>
        <p>
                <strong>
                        Posted <%= time_ago_in_words(comment.created_at) %> ago
                </strong>
                <br/>
                <%= comment.body %>
        </p>
<% end %>

编辑: 这是 cmets 控制器:

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

【问题讨论】:

  • 这与单个评论部分或完全无关。控制器应获取一系列 cmets。
  • 我仍然看不到在哪里获取了一系列 cmets。单个评论模板和评论创建操作,没有任何相关性。
  • @D-side 在我的models/post.rb 我有一个has_many :comments。我想我可以在末尾添加, :order =&gt; '',但我不知道按什么顺序订购。我试过created_atcreated_at DESC
  • 不,我不是这个意思,但我明白需要什么。显然,您正在查看帖子的相关 cmets,例如 @post.comments,对吗?在没有实际代码的情况下使用for-loop 进行标记有点奇怪。

标签: html ruby-on-rails for-loop ruby-on-rails-4


【解决方案1】:

在您的评论模型中,添加:

default_scope -> { order('created_at DESC') }

这样,@post.comments 将被正确排序。

【讨论】:

    【解决方案2】:

    使用默认范围很容易令人困惑,因为如果我尝试Comment.order(:id),我实际上会得到select * from comments order by created_at desc, id asc,这可能需要一些时间来调试,想知道为什么它们不是按id排序,并避免你需要做一些事情比如Comment.unscoped.order(:id),如果你问我这很烦人,我宁愿做一个只有在我知道我需要它时才能调用的范围

    scope :chronological_order -> { order(created_at: :desc) }
    

    然后调用它

    Comment.chronological_order
    

    当然,您可以选择您喜欢的任何范围名称。

    【讨论】:

    • reorder 看起来比unscope.order 好得多,尽管含义相同。而default_scope 往往会在您更频繁地应用某个范围的情况下使代码更短和更干燥。只是另一方面。
    猜你喜欢
    • 2012-07-20
    • 2016-03-18
    • 2019-02-22
    • 1970-01-01
    • 2012-07-06
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多