【问题标题】:rails + activerecord: how create a hash from table with particular field's value as keyrails + activerecord:如何从具有特定字段值作为键的表中创建哈希
【发布时间】:2013-07-11 16:43:45
【问题描述】:

给定一个表 ZipCodeInfos,其中包含字段 zipcode、state、city(所有字符串),其中 zipcode 是唯一的:

zipcode,city,state
"10000", "Fooville", "AA"
"10001", "Smallville", "AA"
"10002", "Whoville", "BB"

生成整个表的哈希对象的最快方法是什么,其中邮政编码是这样的键:

{ "10000" => {:city => "Fooville", :state => "AA" },
"10001" => {:city => "Smallville", :state => "AA" },
"10002" => {:city => "Whoville", :state => "BB" } }

我知道对于给定的记录,我可以使用 .attributes 生成带有键、值对的字段名、字段值对的哈希,例如 Zipcode.first.attributes 给我

{"id" => 1, "zipcode" => "10000", "city" => "Fooville", "state => "AA" }

但是,由于没有对每条记录进行蛮力迭代(通过 .map),我无法完全弄清楚如何使用邮政编码作为散列的每个节点的键来创建所需的散列。

这是我能想到的最好的,我怀疑有一些漂亮的 Ruby 优点更快?

zip_info_hash = {}
ZipCodeInfo.all.map{|x| zip_info_hash[x.zip] = 
                       {'state' => x.state, 'city' => x.city }}

【问题讨论】:

    标签: activerecord hash


    【解决方案1】:

    你也可以试试:

    ZipCodeInfos.all.group_by &:zipcode 
    

    将为您提供邮政编码哈希到 ZipCodeInfos 活动记录数组。

    【讨论】:

      【解决方案2】:

      您可以使用注入方法。 这是我通常使用的。

      def visitors_name_email
        visitors.inject({}) do |result, visitor|
          result.merge(visitor.name => visitor.email)
        end
      end
      

      【讨论】:

        【解决方案3】:

        我想不出一种方法来避免map 在这里。我只会对你的代码做一些小的改动:

        zip_info=Hash[*ZipCodeInfo.all
                                  .map{|x| [x.zip, {:city => x.city, :state => x.state}]}
                                  .flatten]
        

        【讨论】:

          猜你喜欢
          • 2012-07-06
          • 2021-10-19
          • 2013-03-05
          • 1970-01-01
          • 2020-08-24
          • 2015-07-21
          • 1970-01-01
          • 2018-10-25
          • 2019-04-23
          相关资源
          最近更新 更多