【发布时间】:2014-01-20 12:14:40
【问题描述】:
我正在尝试从 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}]}]}}
现在,我在下面的代码运行并将嵌套块的结果插入到表中,但每次通过 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
【问题讨论】:
-
首先,让
@groupingsXname和@groupingsX_id成为一个哈希数组怎么样,这样您就可以用@groupings[index] = {"name" => grouping["name"], "id" => grouping["id"]}替换这六个分配,或者只是让grouping成为一个哈希数组?另外,考虑使用:name和:id,而不是"name"和"id"作为键。最后,将{"email"=>"email",...放在多行中会很有帮助,并带有行继续字符\,因此读者不必水平滚动即可阅读该行。 -
@CarySwoveland 感谢您的建议。我做了一些更改,现在确实将数据正确写入数据库。不过,它似乎仍然可以改进。你有什么建议?如果您添加答案,我会接受。
-
你能澄清一下,第一个
{"email" => "email"...实际上是指一个电子邮件地址吗?所以在实际使用中会是{"email" => "andy@example.com"....?我知道你已经缩减了这个例子,但是如果这是实际发生的事情,你可以使用虚拟电子邮件地址吗?我不熟悉 Mailchimp。 -
@Beartech 是的,你是对的。我的占位符选择不佳。我在示例中添加了一个虚拟电子邮件地址。
-
所以
{"email"=>"dummy@gmail.com",可以被剥离以移除外部哈希?列是恒定的吗?即是否会有可变数量的分组?以及分组内的可变数量的组?另外,有没有机会为此使用 Rails?