红宝石集团通过foreach中的第一个字母收集

时间:2014-05-21 20:16:02

标签: ruby-on-rails ruby ruby-on-rails-4 haml

我有这样的数据集合:

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...

我没想到如何在视野中选择第一个字母和小组......也许有人有想法?

1 个答案:

答案 0 :(得分:2)

.group_by是你的朋友:

@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评论