Код:
<%= shop.name.join(", ") %>
Не сработает, потому что вы уже находитесь внутри блока, а объединение - это метод, специфичный для перечислимых объектов, где на данный момент у вас просто есть какой-либо объект.
То, что вы хотите здесь на самом деле:
<%= city.spots.map { |shop| shop.name }.join(", ") %>
Причина, по которой это работает, заключается в том, что:
city.spots.map { |shop| shop.name }
даст вам массив имен всех магазинов, которыезатем вы можете присоединиться, используя выбранную вами строку.
Вы также можете убедиться, что html экранирует имена (на всякий случай):
<%= h( city.spots.map { |shop| shop.name }.join(", ") ) %>
РЕДАКТИРОВАТЬ:
Как указал injekt, и в целях полноты вы также можете использовать Symbol # to_proc и использовать:
<%= city.spots.map(&:name).join(", ") %>
EDIT PART2:
Теперь, когда у нас есть новый окружающий блокнам нужно переписать выражение:
<%= h( country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ") ) %>