Подтвердить что ты не робот

Массив Activerecord объектов, разделенных запятыми

Скажем, у меня есть модель под названием "Фрукты", и запрос возвращает все различные имена фруктов в @fruit:

  • ! ruby ​​/object: Атрибуты фруктов: fruit_name: orange attributes_cache: {}

  • ! ruby ​​/object: Атрибуты фруктов: fruit_name: apple attributes_cache: {}

  • ! ruby ​​/object: Атрибуты фруктов: fruit_name: персик attributes_cache: {}

Я понимаю (несколько) @fruit - это массив, состоящий из массивов (объектов activerecord). Я пытаюсь получить имена возвращенных фруктов в строку, разделенную запятой, например: "оранжевый, яблочный, персиковый".

Если массив состоял из строк или чисел (вместо массивов), я знаю, что для этого можно использовать карту w/.join(','). У меня возникают проблемы с дополнительным синтаксисом, необходимым для ссылки на массивы в массиве (поля "fruit_name" массивов при каждом индексе массива).

Я знаю, что это сработает, просто не уверен, как это сделать как динамическую итерацию:

@fruit_string = @fruit [0].fruit_name + ',' + @fruit [1].fruit_name + ',' + @fruit [2].fruit_name

4b9b3361

Ответ 1

@fruit_string = @fruit.map { |f| f.fruit_name }.join ','

Теперь, когда блок состоит из вызова метода без параметров и для нескольких сложных причин 1 вы можете записать его как

@fruit_string = @fruit.map(&:fruit_name).join ','


1. Унарный и оператор превращает procs в блоки и блоки в proc. Если операндом не является, тогда он сначала вызывает to_proc, если это возможно. (И да, у Symbol есть to_proc.) Это еще более сложно, но причина в том, что это приятное дополнение к карте.

Ответ 2

Или используйте короткую передачу proc:

@fruit_string = @fruit.map(&:fruit_name).join(',')