Карта с условиями - PullRequest
       33

Карта с условиями

0 голосов
/ 22 октября 2019

Как я могу использовать #map, чтобы скрыть атрибут, если он nil?

Условия не работают внутри блока, поэтому я попробовал это:

account_info = some_db_request
account_info.fields.map do |field|
                    {
                        id: field.id,
                        hidden: field.hidden
                        size: field.size
                    }
account_info
=> "{\"email\":\"admin@test.com\",\"name\":\"admin@test.com\",\"roles\":[\"admin\",\"user\"],\"fields\":[{:id=>3, :hidden=>"",size=>80},{:id=>3, :hidden=>"true",size=>80}],\"redirect_to\":[]}"
then I convert output in json

IОжидаемый:

"fields": [
        {
            "id": 3, # if hidden = ''
            "size": 90
        },
        {
            "id": 4,
            "hidden": "true", if hidden = 'true'
            "size": 190
        }]

Но получил:

"fields": [
        {
            "id": 3,
            "hidden" = ''
            "size": 90
        },
        {
            "id": 4,
            "hidden": "true" if hidden = 'true'
            "size": 190
        }]

Как я могу получить ожидаемый результат?

1 Ответ

3 голосов
/ 22 октября 2019

Быстрое и грязное решение состоит в том, чтобы просто сжать хэш после:

account_info.fields.map do |field|
  {
    id: field.id,
    hidden: field.hidden
    size: field.size
  }.compact!
end

или

account_info.fields.map do |field|
  {
    id: field.id,
    hidden: field.hidden
    size: field.size
  }.reject{|k,v| v.nil?}
end

Или, наконец, без присвоения нулевых значений в первую очередь:

account_info.fields.map do |field|
  h = Hash.new
  h[:id] = field.id if !field.id.nil?
  h[:hidden] = field.hidden if !field.hidden.nil?
  h[:size] = field.size if !field.size.nil?
  h
end
...