我正在尝试提取从 Mailchimp 的嵌套哈希中返回的一些数据。这是我得到的结果的精简版本。对于每封电子邮件都有多个 GROUPINGS,并且对于每个 GROUPING 都有多个 GROUPS。
我的目标是将其放入一个 mysql 表中,其布局如下:email_addr、list、grouping1_id、grouping1_name、group1_name、group1_interest、group2_name、group2_interest、grouping2_id、grouping2_name 等。因此,每个订阅者有一行包含所有分组和组信息。
{"email"=>"dummy@gmail.com", "merges"=>{"EMAIL"=>"dummy@gmail.com",
"GROUPINGS"=>[{"id"=>1, "name"=>"Grouping One", "groups"=>[{"name"=>"Group One",
"interested"=>false}, {"name"=>"Group", "interested"=>true},
{"name"=>"Group Three", "interested"=>true}]}, {"id"=>2, "name"=>"Grouping Two",
"groups"=>[{"name"=>"Group Four", "interested"=>false},
{"name"=>"Group Five", "interested"=>false}]}]}}
现在,我下面的代码运行并将嵌套 block 的结果插入表中,但每次通过 groups.each_with_index 语句都会有一行。到目前为止,我的方法似乎过于复杂,但我不确定如何正确处理数据。
感谢任何帮助。
更新: 我稍微清理了逻辑,并将数据库写入分离到哈希处理的每个级别。现在数据已正确插入并更新到数据库中。虽然这样感觉还是很不优雅。
def organize_members_subs
@members_data = @members_subs["data"]
@members_data.each do |member|
@email_addr = member["email"]
@db.query("INSERT INTO db.details
(email_addr, list)
VALUES ('#{@email_addr}', '#{@list}' ) ")
groupings = member["merges"]["GROUPINGS"]
groupings.each_with_index do |grouping, index|
@groupings_name = grouping["name"]
@groupings_id = grouping["id"]
@groupings_label = "grp#{index}_"
@db.query("UPDATE db.details
SET grouping#{index}_id = '#{@groupings_id}'
, grouping#{index}_name = '#{@groupings_name}'
WHERE email_addr = '#{@email_addr}' ")
groups = member["merges"]["GROUPINGS"][index]["groups"]
groups.each_with_index do |group, index|
@group_name = group["name"]
@group_interested = group["interested"]
@db.query("UPDATE db.details
SET #{@groupings_label}group#{index}_name = '#{@group_name}'
, #{@groupings_label}group#{index}_int = '#{@group_interested}'
WHERE email_addr = '#{@email_addr}' ")
break if index == groups.length
end
break if index == groupings.length
end
end
end
最佳答案
首先,我想仔细看看你的哈希值。我没有自己重新格式化它,而是这样做了:
require "awesome_print"
h = `{"email"=>..., "interested"=>false}]}]}}`
ap h
向下滚动到我的答案的底部,查看 ap 的哈希格式。
假设数据库结构是给定的,我将回答您的问题,但想提出几点:
- 如果
“id”
对于每个分组
记录都是唯一的,您能否将其作为键,并免除索引
? - 如果
“name”
对于每个分组
记录都是唯一的,您可以放弃“id”
和索引
? - 如果
“name”
对于每个group
记录都是唯一的(对于给定的分组
),您可以只拥有group[每个组的“名称”] => 组[“感兴趣”]
?
继续讨论您的代码,我还将假设给出了您的哈希结构。稍后,我将重新审视这个假设。
我对您的代码提出的更改相当小,有些纯粹是风格上的:
- 将所有实例变量设为局部变量,这意味着必须将两个附加参数传递给
deforganize_members_subs
。 - 除了两种可能的异常(exception)情况外,消除定义后仅使用一次的局部变量。例如,而不是
groupings_id = grouping["id"]
,然后SET grouping#{index}_id = '#{@groupings_id}'
,只需SET grouping#{index }_id = '#{分组["id"]}'
。 两个可能的异常(exception)是分组
和组
。例如,您可以通过编写来摆脱前者member["merges"]["GROUPINGS"].each_with_index |分组,index_1|
。我将它们保留为变量(这样我可以轻松检查它们的值), 但这是一个风格决定。 groupings.each_with_index do |grouping, index|
中的变量index
位于内部 block 的范围内,该 block 使用同名的迭代器变量。 我认为后者优先,但它们应该以不同的方式命名。我已将它们分别更改为index_out
和index_in
。index_out
范围从0
到groupings.length-1
,因此break if index_out == groupings.length
永远不会被执行,因此可能会被删除。break if index_in == groups.length
也是如此。- 我将
groupings_label = "grp#{index}_"
下移,以引起人们注意,它仅在稍后才需要,而不是在前面的SET
表达式中。
这些更改会导致以下结果:
def organize_members_subs(db, list, @members_subs["data"])
members_data.each do |member|
email_addr = member["email"]
db.query("INSERT INTO db.details
(email_addr, list)
VALUES ('#{email_addr}', '#{list}' ) ")
groupings = member["merges"]["GROUPINGS"]
groupings.each_with_index do |grouping, index_out|
db.query("UPDATE db.details
SET grouping#{index_out}_id = '#{grouping["id"]}'
, grouping#{index_out}_name = '#{grouping["name"]}'
WHERE email_addr = '#{email_addr}' ")
groupings_label = "grp#{index_out}_"
groups = member["merges"]["GROUPINGS"][index_out]["groups"]
groups.each_with_index do |group, index_in|
db.query("UPDATE db.details
SET #{groupings_label}group#{index_in}_name = '#{group["name"]}'
, #{groupings_label}group#{index_in}_int = '#{group["interested"]}'
WHERE email_addr = '#{email_addr}' ")
end
end
end
end
看看你的哈希值,我想知道你是否可以将其简化为以下内容(格式由很棒的打印提供):
{
"email" => "dummy@gmail.com",
"merges" => {
"EMAIL" => "dummy@gmail.com",
"GROUPINGS" => {
1 => {
"name" => "Grouping One",
"groups" => {
"Group One" => false,
"Group Two" => true,
"Group Three" => true
}
},
2 => {
"name" => "Grouping Two",
"groups" => {
"Group Four" => false,
"Group Five" => false
}
}
}
}
}
甚至
{
"email" => "dummy@gmail.com",
"merges" => {
"EMAIL" => "dummy@gmail.com",
"GROUPINGS" => {
"Grouping One" => {
"Group One" => false,
"Group Two" => true,
"Group Three" => true
},
"Grouping Two" => {
"Group Four" => false,
"Group Five" => false
}
}
}
}
这些与其说是建议,不如说是发人深省。
精彩的打印应用于您的哈希:
ap h # =>
{
"email" => "dummy@gmail.com",
"merges" => {
"EMAIL" => "dummy@gmail.com",
"GROUPINGS" => [
[0] {
"id" => 1,
"name" => "Grouping One",
"groups" => [
[0] {
"name" => "Group One",
"interested" => false
},
[1] {
"name" => "Group",
"interested" => true
},
[2] {
"name" => "Group Three",
"interested" => true
}
]
},
[1] {
"id" => 2,
"name" => "Grouping Two",
"groups" => [
[0] {
"name" => "Group Four",
"interested" => false
},
[1] {
"name" => "Group Five",
"interested" => false
}
]
}
]
}
}
关于mysql - 如何将嵌套哈希提取到数据库表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893269/