Activerecord Массив объектов в строку через запятую - PullRequest
10 голосов
/ 30 января 2011

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

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

  • ! ruby ​​/ object: Fruit атрибуты: fruit_name: apple attribute_cache: {}

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

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

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

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

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

Ответы [ 2 ]

30 голосов
/ 30 января 2011
@fruit_string = @fruit.map { |f| f.fruit_name }.join ','

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

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


1. Унарный оператор & превращает процы в блоки, а блоки в процы. Если операнд не тот, то сначала он вызывает to_proc, если может. (И да, у Symbol есть to_proc.) Это даже сложнее, чем это, но по этой причине это хорошее содержательное дополнение к карте.
17 голосов
/ 30 января 2011

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

@fruit_string = @fruit.map(&:fruit_name).join(',')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...