例如,我收集了这样的数据:
80 (0)
90 (0)
100 (0)
200 (0)
A2 (0)
A3 (0)
A4 (0)
A5 (0)
A6 (0)
A8 (0)
Allroad (0)
Cabriolet (0)
Coupe (0)
Q7 (0)
Quattro (0)
R8 (0)
RS4 (0)
RS6 (0)
S2 (0)
S3 (0)
S4 (0)
S5 (0)
S6 (0)
S8 (0)
TT (0)
V8 (D11) (0)
这样的观点:
.vip-offers#manufacturers-list
.man-area
%ul
- @models.each do |car|
%li
= link_to "#{car.name} (#{car.get_cars_model_count(car.id)})", advanced_search_show_path(by_model: car.id), id: "link-blue", data: { no_turbolink: true }
如您所见 - 我将整个数据显示为列表,但我需要按名称的第一个字母对其进行分组,例如:
8
80 (0)
9
90 (0)
1
100 (0)
2
200 (0)
A
A2 (0)
A3 (0)
A4 (0)
A5 (0)
A6 (0)
A8 (0)
Allroad (0)
etc...
我没想到如何选择第一个字母并在 View 中按它分组...也许有人有想法?
最佳答案
.group_by
是你的 friend :
@grouped_cars = cars.group_by { |one_record| one_record.name[0].to_s # returns the first letter of the name }
这段代码应该创建一个哈希结构如下:
{
'0' => [<Car id:12, name: '007'>],
'A' => [<Car id:13, name: 'Audi'>, <Car id:14, name: 'Audi RS5'>],
# etc.
}
然后你可以做:
%ul
- @grouped_cars.each do |first_letter, cars|
%li.first_letter= first_letter
%ul
- cars.each do |car|
%li.one_car= car.name
您可能想在 group_by
block 中添加一些内容:
@grouped_cars = cars.group_by do |car|
car.name[0].to_s.upcase # transforms 'a' into 'A'
end
我还注意到您可能会松散字母顺序,因为散列没有排序。要解决此问题,您可以执行以下操作:
%ul
- @grouped_cars.keys.sort.each do |letter|
%li.first_letter= first_letter
%ul
- @grouped_cars[letter].each do |car|
%li.one_car= car.name
或者查看@DaniëlKnippers 对我的回答的评论
关于ruby-on-rails - 通过 foreach 中 View 中的第一个字母进行 ruby 组集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23792947/