Задать вопрос
@kramidev

Rails. Как добавлять элементы в массив в хеше?

Привет всем.
Есть хэш. В хеше есть массив например 'pictures'. Как добавлять в массив элементы?
hash = {'pictures' => [] }
someArray.each do |a|
   hash['pictures'].push(a) # не работает :/
end


=================== все получилось, добавил немного логики. всем спасибо.

def check_docs(docs)
    if docs.nil?
      false
    else
      hash = {}
      docs.each do |doc|
        name = doc.original_filename.split('.').last
        if pic(name) != false
          hash['pictures'] = [] unless hash['pictures']
          hash['pictures'] << doc
        end
        if doc(name) != false
          hash['docs'] = [] unless hash['docs']
          hash['docs'] << doc
        end
      end
      if hash.size > 0
        hash
      else
        false
      end
    end
  end
  • Вопрос задан
  • 2594 просмотра
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
Проверил ваш вариант -- у меня работает. Вот альтернативный синтаксис:
hash = {'pictures' => [] }
someArray.each do |a|
   hash['pictures'] << a 
end
Ответ написан
viktorvsk
@viktorvsk
Попробуйте, вот так полегче читается, вроде:
def check_docs(docs)
  return false unless docs.present?
  hash = {}
  docs.each do |doc|
    name = doc.original_filename.split('.').last
    hash['pictures']  << doc if pic(name) != false and hash['pictues'] ||= []
    hash['docs']      << doc if doc(name) != false and hash['docs'] ||= []
  end
  hash.presence
end

Разве что, две оговорки:
1. Первая и последняя строчка подразумевают, что используется Rails (ну, или хотябы ActiveSupport)
2. Если hash будет пустой, вернется не false, а nil

P.S. Кстати, какая-то плохая идея в блоке each использовать переменную doc и там же обращаться к какому-то методу doc() (с одинаковыми именами)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы