У меня есть ответ, который хэш и массив хэшей:

"id"=>67547,
 "description"=>"project",
 "actors"=>
  [
    {"id"=>123,
    "displayName"=>"John Doe",
    "type"=>"atlassian-user-role-actor",
    "name"=>"john.doe",
    "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>456,
     "displayName"=>"Chris Sth",
     "type"=>"atlassian-user-role-actor",
     "name"=>"chris.sth",
     "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>789,
     "displayName"=>"Testing Name",
     "type"=>"atlassian-user-role-actor",
     "name"=>"testing.name",
     "actorUser"=>{"accountId"=>"some_id"}},
  ]

Мне нужно вытащить имя для каждого hash['actors'] и преобразовать его в адрес электронной почты. Дело в том, что мне нужно пропустить имена, которые определены как EXCLUDED_NAMES

EXCLUDED_NAMES = %w[
  chris.sth
  removed1258986304
  john.doe
  other.names
].freeze

private_constant :DEFAULT_EXCLUDED_NAMES

Я пытался что-то вроде ниже, но все же получить все имена:

def setup_email
  dev_role['actors'].map do |user|
    if user.include?(EXCLUDED_NAMES)
      user.delete
    else
      "#{user['name']}@example.com"
    end
  end
end
0
mr_muscle 4 Фев 2020 в 14:15

4 ответа

Лучший ответ

Если dev_role['actors'] это:

  [
    {"id"=>123,
    "displayName"=>"John Doe",
    "type"=>"atlassian-user-role-actor",
    "name"=>"john.doe",
    "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>456,
     "displayName"=>"Chris Sth",
     "type"=>"atlassian-user-role-actor",
     "name"=>"chris.sth",
     "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>789,
     "displayName"=>"Testing Name",
     "type"=>"atlassian-user-role-actor",
     "name"=>"testing.name",
     "actorUser"=>{"accountId"=>"some_id"}},
  ]

Тогда несомненно, что user в блоке each будет объектом Hash:

{
  "id"=>123,
  "displayName"=>"John Doe",
  "type"=>"atlassian-user-role-actor",
  "name"=>"john.doe",
  "actorUser"=>{"accountId"=>"some_id"}
}

Таким образом, выполнение user["name"] должно привести к: "john.doe".

Теперь, когда у нас есть список исключений EXCLUDED_NAMES, мы могли бы использовать include? < вот так вот:

EXCLUDED_NAMES.include?(user["name"])
=> # true if the name is in the EXCLUDED_NAMES

Итак, все, что вам нужно, это небольшое изменение в вашем коде, чтобы исправить условие:

def setup_email
  dev_role['actors'].map do |user|
    if EXCLUDED_NAMES.include?(user["name"])
      user.delete
    else
      "#{user['name']}@example.com"
    end
  end
end

Однако есть одна проблема: user.delete не будет работать, так как ожидает аргумент, который должен быть ключом к хеш-объекту.

Это можно исправить с помощью reject или select (изменяя на reject, так как читается лучше):

def setup_email
  dev_role['actors'].reject do |user|
    EXCLUDED_NAMES.include?(user["name"])
  end.map{ |user| user["name"] }
end

Природа метода, кажется, возвращает массив / список, поэтому я настаиваю на том, что имя таких методов должно быть во множественном числе: setup_emails.

1
Surya 5 Фев 2020 в 05:00

Вы можете получить массив действительных писем с:

emails = dev_role['actors'].map do |user|
  "#{user['name']}@example.com" unless EXCLUDED_NAMES.include?(user['name'])
end

Массив будет содержать только 'testing.name@example.com '

2
romnoks 4 Фев 2020 в 11:49
dev_role=dev_role.to_hash
actors=dev_role["actors"]
for each_actor in actors
    if EXCLUDED_NAMES.include?(each_actor["name"])==false
        p "#{each_actor['name']}@example.com"
    end
end
0
Yashvi Patel 4 Фев 2020 в 15:23