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)
Руби - гениальный язык!
Tweet