如何在 Rails 2.3 中的 .each 循环中排序

Posted

技术标签:

【中文标题】如何在 Rails 2.3 中的 .each 循环中排序【英文标题】:how to sort in .each loop in Rails 2.3 【发布时间】:2011-07-21 21:58:28 【问题描述】:

这是我在视图中的代码。控制器只是从模型中获取@category。

这种排序不起作用。最终我需要它按名称按字母顺序排序。

    <%- @category.brands.sort_by|brand| brand.name.each do |brand| -%>
    <li <%= "class='current'" if brand == @brand %>><%= link_to(brand.name, [@category, brand]) %></li>
<%- end -%>

有什么想法吗?

【问题讨论】:

【参考方案1】:

我会直接使用 sort 函数:

 <% @category.brands.sort  |a,b| a.name <=> b.name .each do |brand| %>
   <li <%= "class='current'" if brand == @brand %>>
     <%= link_to(brand.name, [@category, brand]) %>
   </li>
 <% end %>

【讨论】:

【参考方案2】:

如果您通常按相同的字段排序 您可以在模型上定义 &lt;=&gt; 方法(并且可以选择包含 Comparable ),然后调用 model.sort 它应该可以工作。

在模型中:

class Brand < AcvtiveRecord::Base
  def <=> other
    self.name <=> other.name 
  end
end

观点:

<% @category.brands.sort.each do |brand| %>
<li <%= "class='current'" if brand == @brand %>>
  <%= link_to(brand.name, [@category, brand]) %>
</li>
<% end %>

如果它不是一个关联,我会在控制器中对其进行排序或让模型返回它排序,然后将其与视图一起显示。

然后在控制器中(如果这不是子集合)

  @brands = Brand.all.sort

观点:

<% @brands.each do |brand| %>
<li <%= "class='current'" if brand == @brand %>>
  <%= link_to(brand.name, [@category, brand]) %>
</li>
<% end %>

【讨论】:

这比 ghayes 的方法更“正确”,但效果大致相同。可以混合使用这些方法,只需在控制器中使用参数调用 sort,而不是定义宇宙飞船运算符,如果您不打算在其他任何地方执行此操作。 哈哈宇宙飞船操作员?我从未听说过它被称为此类。我喜欢它。

以上是关于如何在 Rails 2.3 中的 .each 循环中排序的主要内容,如果未能解决你的问题,请参考以下文章

Rails 2.3 自定义验证与循环检查存在

在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]

除了最后一个元素之后,如何在 #each 循环中的元素之间添加分隔符?

你如何找到 For Each (VB.NET) 中的最后一个循环?

如何将 for-each 循环应用于字符串中的每个字符?

在 .each for 循环中选择 rest_in_place