Как я могу получить уникальную группу виртуального атрибута в рельсах? - PullRequest
0 голосов
/ 17 августа 2010

У меня есть несколько похожих моделей ContactEmail, ContactLetter, и так далее.

Каждый belongs_to Контакт

Каждый контакт belongs_to Компания

Итак, я создал виртуальный атрибут для ContactEmail:

  def company_name
    contact = Contact.find_by_id(self.contact_id)

    return contact.company_name

  end

Вопрос: Как получить простой список всех company_name (без дубликатов), если у меня есть набор объектов ContactEmails (например, из метода find (: all))?

Когда я пытаюсь выполнить поиск по ContactEmail.company_name, например, используя гем статистики, я получаю сообщение об ошибке, в котором говорится, что company_name не является столбцом для ContactEmail.

1 Ответ

0 голосов
/ 17 августа 2010

При условии, что ваш набор 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 и обратиться к самому столбцу.

...