Проблема в том, что блок в методе inject должен возвращать новое значение для первого параметра, то есть в вашем случае тот же экземпляр Hash, в который вы пишите результат
Вот вариант с inject, который должен заработать
gon.select_options = Product.all.to_a.inject({}) do |hash, product|
hash[product.id] = product.materials.to_a.inject({}) do |materials_hash, material|
materials_hash[material.id] = get_material_data_hash(material)
materials_hash
end
hash
end
Или используйте each_with_object вместо inject