Enumerable#flat_map

January 26, 2015

В Руби 1.9.2 появился класный метод flat_map , который я незаслуженно обходил стороной.

Он делает все тоже самое, что обычный map, только объединяет возвращаемые значения не в массив, а друг с другом. Официальная документация описывает это так:

[1, 2, 3, 4].flat_map { |e| [e, -e] } #=> [1, -1, 2, -2, 3, -3, 4, -4]
[[1, 2], [3, 4]].flat_map { |e| e + [100] } #=> [1, 2, 100, 3, 4, 100]

В Рейлс же этот метод можно использовать вот так:

class Planet < ActiveRecord::Base
  has_many :countries
end

class Country < ActiveRecord::Base
  has_many :cities
end

class City < ActiveRecord::Base
end

Planet.
  includes(:countries => :cities).
  flat_map(&:countries).flat_map(&:cities)

Руби - гениальный язык!

comments powered by Disqus