Ruby从另一个哈希创建新哈希,并从第一个哈希获得特定值

时间:2020-07-06 12:46:43

标签: ruby-on-rails ruby

我从Webhook请求中得到了哈希值:

   webhook = {"environment"=>"master",
     "entity_type"=>"item",
     "event_type"=>"publish",
     "entity"=>
      {"id"=>"5267370",
       "type"=>"item",
       "attributes"=>{"title"=>"new text webhook", "is_separate_activity"=>false, "short_description"=>"webhook", "long_description"=>"new text webhook", "text"=>["5267545"], "author"=>"test", "reading_time"=>"4 min", "updated_at"=>"2020-07-06T13:25:30.599+01:00", "created_at"=>"2020-07-06T12:41:45.495+01:00"},
       "relationships"=>{"item_type"=>{"data"=>{"id"=>"245189", "type"=>"item_type"}}, "creator"=>{"data"=>{"id"=>"7243", "type"=>"user"}}},
       "meta"=>{"created_at"=>"2020-07-06T12:41:45.495+01:00", "updated_at"=>"2020-07-06T13:25:30.599+01:00", "published_at"=>"2020-07-06T13:25:30.599+01:00", "publication_scheduled_at"=>nil, "first_published_at"=>"2020-07-06T12:41:45.511+01:00", "is_valid"=>true, "status"=>"published", "current_version"=>"9718212"}}}

我只需要存储来自该哈希的基本信息:

webhook.dig('entity', 'id')

webhook.dig('entity', 'attributes', 'separate_activity')

webhook.dig('entity', 'attributes', 'title')

webhook.dig('entity', 'attributes', 'short_description')

,并将其另存为t.json "content_basic"到Session模型。是否有任何巧妙的方法(也许是一行?)来将几个键/值对抢到另一个哈希?

2 个答案:

答案 0 :(得分:0)

不确定是否需要以下内容:

entity = webhook.dig('entity')

data = {
  id: entity['id'],
  is_separate_activity: entity.dig('attributes', 'is_separate_activity'),
  title: entity.dig('attributes', 'title'),
  short_description: entity.dig('attributes', 'short_description'),
}

Session.create(content_basic: data.to_json)

您可能会对此进行重构,但不确定真正要保存的内容。

keys = [ 'short_description', 'is_separate_activity', 'title' ]
values = webhook.dig('entity', 'attributes').values_at('short_description', 'is_separate_activity', 'title') 

data = { id: webhook.dig('entity', 'id') }
keys.each_with_index{|k, i| data[k] = values[i]}

答案 1 :(得分:-1)

e = webhook['entity']
ea = e['attributes']
[e['id'], ea['separate_activity'], ea['title'], ea['short_description']]
  #=> ["5267370", nil, "new text webhook", "webhook"]

我建议不要在知道哈希结构并且嵌套键都应存在的情况下使用dig,原因很简单:在哈希没有应包含的键时,最好引发异常比dig安静地返回nil的情况。当然,如果dig返回nil,人们可能会进行调查(以代码形式),但是仅仅引发一个异常那么简单又有什么意义呢?

如果h是哈希,并且

h[:a][:b][:c] #=> nil

我们知道,因为没有引发异常,所以f = h[:a] g = f[:b]是哈希值,但是g的键值为:c或{ {1}}没有密钥nil(例如,与上面的g一样)。因此,在这种情况下,如果已知:c的键ea['separate_activity']具有非null值,则应该引发异常。相对于使用g

:c

仅告诉我们在挖掘过程中遇到问题。