Одно значение Ruby в одной строке из коллекции - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть коллекция предметов.В каждом объекте есть 3 свойства

'id', 'name', 'is_primary'

Коллекция объектов обычно имеет от 1 до 5 объектов.

Что я хочу сделать, так это проверить коллекцию, чтобы убедиться, что is_primary имеет значение true.Если это так, выведите имя или хотя бы верните его.

Я хочу сделать это в 1 строке кода, если это возможно.Я пытаюсь уменьшить эту строку для вывода erb в рельсах.Позже на странице я выведу их все.Я думал, что у меня есть, но если я верну ноль, это добавляет дополнительное пространство, которое странно сдвигает все HTML.

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Хм, это не совсем работает, если нет элемента is_primary ... Я все еще думаю ...

c.detect(&:is_primary).name

Хорошо, как насчет:

((a = c.detect(&:is_primary)) && a.name).to_s

Как это бывает, в шаблоне erb нормально, что выражение <%= возвращает nil, что просто приводит к пустой строке, поэтому для этого случая вы можете использовать:

(a = c.detect(&:is_primary)) && a.name

Обновление: Отвечая на первый комментарий, у меня есть тестовый пример, который я не опубликовал ...

class A; attr_accessor :is_primary, :name, :id; end
t = [A.new, A.new, A.new, (a = A.new; a.name = 'xyz'; a.is_primary = true; a)]

puts (a = t.detect(&:is_primary)) && a.name

puts ((a = [].detect(&:is_primary)) && a.name).to_s
0 голосов
/ 12 февраля 2011

Дополняя @DigitalRoss, вы также можете написать:

collection.detect(&:is_primary).try(:name) || "default_if_no_element_or_name"

(ну, если честно, я предпочитаю Ick's возможно вместо Rails ' try : c.detect(&:is_primary).maybe.name)

Примечание: ИМХО флаг, который может быть активен только для строки, не очень хорошая идея. У вас могут быть несовместимые состояния с активностью более одного, и вы будете беспокоиться об этом при обновлении (транзакции и т. Д.). Попробуйте сохранить ссылку на PK где-нибудь еще (родительская модель - модель состояния?).

Я хочу сделать это в 1 строке кода, если это возможно. Я пытаюсь уменьшить эту строку для вывода erb в рельсах. Позже на странице я выведу их все.

Нет необходимости в однострочниках (забавно, так как я только что написал): перенесите код к вашим моделям или помощникам по мере необходимости и сохраните ваши взгляды нетронутыми.

...