例如,我有这样的数据收集:
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...
我没有想到如何选择第一个字母并按它分组...也许有人有想法?
最佳答案
.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
块中添加一些东西:@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 中查看第一个字母的 ruby 组集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23792947/