При условии, что ваш набор ContactEmail
находится в @contact_emails
(не проверено) :
@contact_emails.collect { |contact_email| contact_email.company_name }.uniq
Для этого вам не нужен виртуальный атрибут. ActiveRecord устанавливает связь автоматически на основе внешнего ключа, поэтому вы можете извлечь метод company_name
из модели ContactEmail и выполнить:
@contact_emails.collect { |contact_email| contact_email.contact.company_name }.uniq
Производительность может учитываться при работе с большими наборами, поэтому вам может потребоваться более сложный SQL-запрос, если это проблема.
РЕДАКТИРОВАТЬ , чтобы ответить на второй вопрос
Если company_name
является столбцом, вы можете сделать:
ContactEmail.count(:all, :joins => :contact, :group => 'contact.company_name')
В отношении виртуального атрибута, я думаю, вам придется извлечь весь набор и использовать Ruby (не проверено) :
ContactEmail.find(:all, :joins => :contact, :select => 'contacts.company_name').group_by(&:company_name).inject({}) {|hash,result_set| hash.merge(result_set.first=>result_set.last.count)}
но это не очень любезно по отношению к следующему человеку, назначенному для обслуживания вашей системы - так что вам лучше выработать синтаксис запроса для версии .count
и обратиться к самому столбцу.