我想基于来自属于父级的子对象集合的外键组合来创建哈希(使用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创建这样一个哈希的最有效方法?如果只是少数几个孩子反复迭代,那么我就不会太担心效率;但是,在我的情况下可能会有很多,所以我希望你能以最有效的方式输入你可以推荐构建哈希的方法。
答案 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 '-')")