如何在 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】:如果您通常按相同的字段排序
您可以在模型上定义 <=>
方法(并且可以选择包含 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 循环中排序的主要内容,如果未能解决你的问题,请参考以下文章
在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]
除了最后一个元素之后,如何在 #each 循环中的元素之间添加分隔符?