Массив 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
Ответы
Ответ 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(',')