Помимо предыдущих точных наблюдений, я хотел бы добавить следующее:
Точка 1.
Важно констатировать, что @ivars
может не работать с параметрами формальной функции ... При этом, я думаю, недопустимо иметь:
collection.each { |@not_valid| }
Это также плохая практика иметь @ivars
внутри блоков, вы не будете точно знать, в каком контексте будет выполняться этот блок (как вы знаете, ссылка self
внутри этого блока может отличаться от self
ссылка вне его).
Точка 2.
Еще один момент, который вы должны иметь в виду, это то, что если вы не присваиваете результат оператора (||), это вообще не приведет к каким-либо изменениям (просто будет тратить время), однако вы можете использовать:
mail_hash[email.ticketno] = mail_hash[email.ticketno] || Hash.new
Это можно легко переписать на:
mail_hash[email.ticketno] ||= Hash.new
Точка 3.
Даже если email.attributes.keys
- дешевая инструкция, она не бесплатна ... Я бы посоветовал иметь ее вне блока итераций (учитывая, что ключи всегда будут одинаковыми для каждой записи, учитывая, что мы не используем базы данных документов).
Окончательный результат
require 'active_support'
mails = Email.all
@mailshash = mails.inject(Hash.new) do |hsh, mail|
# mail.attributes is already a representation of the
# email record in a hash
hsh[mail.ticketno] = mail.attributes
hsh
end