Создание хэша на основе составных ключей в коллекции дочерних объектов - PullRequest
2 голосов
/ 11 ноября 2011

Я хочу создать хеш (используя Base64) на основе компоновки внешних ключей из коллекции дочерних объектов, принадлежащих родительскому элементу.

class Basket < ActiveRecord::Base
  has_many :items
end

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

Итак, допустим, у нас есть объект корзиныимеет три объекта item:

Item # 1
- mfg_id: 1
- locale_id: 2

Item # 2
- mfg_id: 3
- locale_id: 4

Item # 3
- mfg_id: 5
- locale_id: 6

Хэш хотел бы что-то вроде:

Base64.encode64 (12-34-56)

Мой вопрос на самом деле, каков наиболее эффективный способ вruby создать такой хеш?Если бы это были всего несколько дочерних объектов для перебора, то я бы не слишком беспокоился об эффективности;однако в моем случае их может быть много, поэтому я хотел бы, чтобы вы указали наиболее эффективный способ, которым вы можете порекомендовать построить хеш.

1 Ответ

2 голосов
/ 11 ноября 2011

Может быть:

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

Должно быть чудовищное количество предметов, чтобы что-то подобное было неэффективным (из-за создания промежуточного массива).Вы также можете использовать команду inject, чтобы построить строку на месте и избежать промежуточного массива, но это довольно уродливо по сравнению с map + join.

И использованием чистого SQL (не так переносимого, но быстрее):

basket.items.select("GROUP_CONCAT(mfg_id, locale_id SEPARATOR '-')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...