Definições

Método map

O método executado em um array. Retorna um novo array, onde para cada elemento do array antigo ele executa o código específicado. Exemplo:

arr1 = [0,1,2,3,4,5]

# Multiplicar cada elemento do array por 2
arr1.map {|i| i*2}
=> [0,2,4,6,8,10]

# Elevar ao quadrado cada elemento do array
arr1.map {|i| i*i}
=> [0,1,4,6,16,25]

Método flat_map

O método executado em um array. Retorna um novo array, onde para cada elemento o valor retornado é a concatenação do resultado do bloco. Exemplo

arr1 = [0,1,2,3,4,5]

# Multiplicar cada elemento do array por 2
# e manter o valor original
arr1.flat_map {|i| [i, i*2]}
=> [0,0,1,2,2,4,3,6,4,8,5,10]

# Elevar ao quadrado cada elemento do array
# e manter o valor original
arr1.flat_map {|i| [i, i*i]}
=> [0,0,1,1,2,4,3,9,4,16,5,25]

# Elevar ao quadrado cada elemento do array,
# manter o valor original em uma mesmo posição
# do array pai
arr1.flat_map {|i| [[i, i*i]]}
=> [[0,0],[1,1],[2,4],[3,9],[4,16],[5,25]]

# Tornar o array mais "flat"
arr2 = [[1,2], [3,4]]
arr2.flat_map {|i| i}
=> [1,2,3,4]

Perfomance

Caso deseje comparar as perfomances de cada um dos métodos, você pode executar esse código na sua máquina e comparar os resultado

require 'benchmark/ips'

Benchmark.ips do |bm|
  list = (0..10_000).to_a

  bm.report "flat_map" do
    list.flat_map do |x|
      [x, x * x]
    end
  end

  bm.report "map.flatten" do
    list.map do |x|
      [x, x * x]
    end.flatten
  end

  bm.compare!
end

Resultados

Warming up --------------------------------------
            flat_map    90.000  i/100ms
         map.flatten    39.000  i/100ms
Calculating -------------------------------------
            flat_map    883.196  (± 9.3%) i/s -      4.410k in   5.049088s
         map.flatten    382.937  (± 2.9%) i/s -      1.950k in   5.096364s

Comparison:
            flat_map:      883.2 i/s
         map.flatten:      382.9 i/s - 2.31x  (± 0.00) slower