【问题标题】:synthesizing long parameter strings合成长参数字符串
【发布时间】:2022-01-08 08:18:09
【问题描述】:

在消费 JSON 字符串时,参数可以深度嵌套,使得读取/检查变得乏味:

update(capture_created: params[:data][:object][:created], capture_currency: params[:data][:object][:currency]  
...[...] and so on...

一个节点params[:data][:object] 以什么方式只表示一次,从而能够将子值作为参数处理?

【问题讨论】:

  • object_param = params[:data][:object],因此使用object_param[:created]

标签: json ruby-on-rails


【解决方案1】:

你可以做一些事情。

您可以像 dbugger 提到的那样在局部变量中获取内部哈希:

p = params[:data][:object]
update(capture_created: p[:created], capture_currency: p[:currency], ...)

或者您可以使用#tap#then(取决于您希望从表达式中得到什么返回值):

# This evaluates to params[:data][:object]
params[:data][:object].tap do |p|
  update(capture_created: p[:created], capture_currency: p[:currency], ...)
end

# This evaluates to whatever update returns
params[:data][:object].then do |p|
  update(capture_created: p[:created], capture_currency: p[:currency], ...)
end

如果嵌套哈希中的键只需要一致地重命名(即添加“capture_”前缀),那么#transform_keys

update(params[:data][:object].transform_keys { |k| "capture_#{k}" })

是一个选项。字符串键可以使用 ActiveRecord #update 调用,但如果你真的想要它们,你可以获得符号:

update(params[:data][:object].transform_keys { |k| :"capture_#{k}" })

如果您想确保只访问某些键,您可能需要包含 Hash#slice 调用:

update(params[:data][:object].slice(:created, :currency, ...).transform_keys { |k| :"capture_#{k}" })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多