"REAWLLY_LONG_HASH_A-6ren">
gpt4 book ai didi

ruby-on-rails - 如何重命名哈希参数中的符号?

转载 作者:行者123 更新时间:2023-11-29 14:34:04 25 4
gpt4 key购买 nike

我有来自外部 API 的参数,这些参数使用 CamelCase 格式化 JSON 响应,我想将其放入我的 Rails 应用程序中:

{"AccountID"=>"REAWLLY_LONG_HASH_API_KEY_FROM_EXTERNAL_SERVICE", 
"ChannelProductDescription"=>"0004", "Currency"=>"CAD",
"CurrentBalance"=> {"Amount"=>"162563.64", "Currency"=>"CAD"}}

使用下面的脚本我将它们转换为小写:

data = JSON.parse(response, symbolize_keys: true)
data = {:_json => data} unless data.is_a?(Hash)
data.deep_transform_keys!(&:underscore)
data.deep_symbolize_keys!

让我像这样正确格式化 params:

{:account_id=>"REAWLLY_LONG_HASH_API_KEY_FROM_EXTERNAL_SERVICE", 
:channel_product_description=>"SAVINGS", :currency=>"CAD",
:current_balance=> {:amount=>"43.00", :currency=>"CAD"}}

我正在尝试将此外部 API 响应映射到通用 Rails 模型 Account,其中来自此 API 调用的 JSON 将作为参数干净地返回到我的数据库中,以允许干净的保存接口(interface),例如:

@account = Account.create(ParamParser.call(params))

但是我在转换 :account_id 时遇到了问题,因为该参数与我的数据库的主键冲突。

为了解决这个问题,我的想法是将 params[:account_id] 的所有符号实例转换为 params[:account_key_id],这样那些参数就不会与我的数据库现有的 account_id 字段冲突。

我该怎么做,是否有比我在此处描述的更好的方法来使用外部 JSON API?

最佳答案

Hash#deep_transform_keys 这样做:

Returns a new hash with all keys converted by the block operation. This includes the keys from the root hash and from all nested hashes and arrays.

所以你可以用一个适当的 block 一次完成,比如:

data.deep_transform_keys! do |key|
key = key.underscore.to_sym
key = :account_key_id if(key == :account_id)
key
end

您也可以将 symbolize_keys: true 标志也放到 JSON.parse 中,无论如何您都在更改所有键,所以不要打扰。

如果你经常做这类事情,那么你可以编写一个方法,它接受一个键映射哈希并为你提供一个用于转换键的 lambda:

def key_mangler(key_map = { })
->(key) do
key = key.underscore.to_sym
key = key_map[key] if(key_map.has_key?(key))
key
end
end

然后说这样的话:

data.deep_transform_keys!(&key_mangler(:account_id => :account_key_id))

当然,您可能想使用与 key_mangler 不同的名称,但该名称足以说明这个想法。


顺便说一句,如果你将这个 JSON 发送到数据库中,那么你可能不需要为符号键操心,JSON 只使用字符串作为键,所以你将字符串转换为符号只是为了将它们转换回来到字符串。当然,如果您在从数据库中提取 JSON 时对键进行符号化,那么您可能希望保持一致并全面使用符号。

关于ruby-on-rails - 如何重命名哈希参数中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com