mysql - 如何将嵌套哈希提取到数据库表中?

标签 mysql ruby mailchimp

我正在尝试提取从 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_outindex_in
  • index_out 范围从 0groupings.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/

相关文章:

ruby-on-rails - 递归方法不返回调用者中的上一行位置

mailchimp - MailChimp API 3.0 中 "timeframe"的正确语法是什么

php - PayPal txn_id IPN 检查

php - 如何使用mysql获取位置

ruby-on-rails - Rails 4 内存分析

在 ActiveSupport::Concern 中使用类变量的 Ruby 替代方案

html - 响应式电子邮件 3 列布局未全宽显示

mailchimp - 取消订阅后重新订阅 MailChimp 列表

mysql - MySql 字段列表中的未知列

mysql - SQL : How to check "if this record exists then that record must also exist" for given ID set