【问题标题】:Rails] Changing the way 'render' method iterates a collectionRails] 改变 'render' 方法迭代集合的方式
【发布时间】:2013-01-19 01:41:55
【问题描述】:

当你有部分的时候

/app/views/posts/cmets/_comment.html.erb

执行以下操作

<%= render @post.comments %>

像这样迭代@post.cmets 集合

@post.comments.each do |comment|

自动,即使您没有将集合传入部分。

但是,由于对象按 created_at 排序的方式,这会将 cmets 渲染到另一个方向。

我想换个方向:把集合按created_at DESC倒过来排序,然后迭代cmets集合。

我愿意

PostsContoller<%= render @comments %> 中的@comments = @post.comments.paginate(:page => params[:page], :per_page => 10, :order => "created_at") 而不是 <%= @post.comments %>,但我很好奇是否有更常见的方法。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails render loops


    【解决方案1】:

    你肯定想做:

    @comments = @post.comments.order("created_at ASC").paginate(page: params[:page])
    

    而不是改变 Rails 助手的工作方式!你为什么要这么做?

    您可以定义 cmets 在关联中的排序方式。在 Post 模型中:

    has_many :comments, order: "comments.created_at ASC"
    

    您还可以设置默认范围来更改默认情况下 cmets 的排序方式。

    在模型中:

    default_scope order('created_at ASC')
    

    【讨论】:

    • 我不会将范围放在 Comment 模型上(使用 default_scopes 很麻烦),我会将范围放在 Post 模型中的关联上。
    【解决方案2】:

    render @post.comments.paginate(params[:page]) 这样的东西在你的模型中设置的顺序是否有效?例如。

    class Post < ActiveRecord::Base
      has_many :comments, order: 'created_at DESC'
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多