基于子对象集合中的复合键创建哈希

时间:2011-11-11 18:27:24

标签: ruby-on-rails ruby performance hash

我想基于来自属于父级的子对象集合的外键组合来创建哈希(使用Base64)。

class Basket < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :basket
  belongs_to :mfg
  belongs_to :locale
end

所以我们假设我们有一个包含三个项目对象的篮子对象:

  

项目#1
   - mfg_id:1
   - locale_id:2

     

第2项
   - mfg_id:3
   - locale_id:4

     

项目#3
   - mfg_id:5
   - locale_id:6

哈希想要像:

  

Base64.encode64(12-34-56)

我的问题是什么是ruby创建这样一个哈希的最有效方法?如果只是少数几个孩子反复迭代,那么我就不会太担心效率;但是,在我的情况下可能会有很多,所以我希望你能以最有效的方式输入你可以推荐构建哈希的方法。

1 个答案:

答案 0 :(得分:2)

也许:

basket.items.select([:mfg_id, :locale_id]).map { |i| "#{i.mfg_id}#{i.locale_id}" }.join("-")

对于像这样的东西,应该有大量的物品是低效的(因为中间阵列的创建)。您还可以使用inject来构建字符串inplace并避免使用中间数组,但与map + join相比,这非常难看。

使用纯SQL(不那么便携,但速度更快):

basket.items.select("GROUP_CONCAT(mfg_id, locale_id SEPARATOR '-')")