如何从Rails中的ActiveRecords数组中提取"表"?

Tim*_* T. 7 arrays activerecord ruby-on-rails

我有几个类似的模型(ContactEmail,ContactLetter,ContactPostalcard).

例如,ContactEmail中的每个实例(记录)表示特定的电子邮件模板已发送到特定的联系人.

所以,每一个(例如ContactEmail) belongs_to :contact

因此,在ContactEmail模型中,有一个属性ContactEmail.contact_id.

每个联系人都有一个虚拟属性company_name.

因此,当我写下以下内容时,我将在特定集合中发送所有发送的电子邮件条件(在本例中为时间):

@sent_emails = ContactEmail.find(:all, :conditions => "conditions here")
Run Code Online (Sandbox Code Playgroud)

那么,@sent_emails.size会告诉我发送的所有电子邮件的总数.

我的挑战:如何通过不同模型中的独特公司提取更多粒度?

我想要的输出如下所示:

FROM 8/1/10 TO 8/10/10 (where the dates are dynamic)

                Calls       Letter      Postalcards
Company 1         4           2             4
Company 2        10           4             6
Company 3         2           3             4
Run Code Online (Sandbox Code Playgroud)

因此,Company3有2个呼叫,这意味着有两个ContactCalls记录,其中sent_date落在两个日期之间,并且相关联系人属于公司3.

公司1-3未提前设定.它需要从ContactCalls,ContactLetters和ContactPostalcards池中提取.....

挑战在于我不知道这些公司是什么.它们是每个不同记录的联系人部分的属性.所以在某些情况下,我可能让Company2有0个字母.

谢谢你的指导!:)

如何在ContactEmail模型的给定记录上找到公司:

ContactEmail.contact.company.name
Run Code Online (Sandbox Code Playgroud)

这将返回特定ContactEmail的关联公司

ace*_*des 2

这应该做得很好:

    list = Contact.find :all,
      :select => "companies.name company_name, COUNT(contact_emails.id) email_count, COUNT(contact_letters.id) letter_count, COUNT(contact_postalcards.id) postalcard_count",
      :joins => [
        "LEFT JOIN companies ON company.id = contact.company_id",
        "LEFT JOIN contact_emails ON contact_emails.contact_id = contacts.id",
        "LEFT JOIN contact_letters ON contact_letters.contact_id = contacts.id",
        "LEFT JOIN contact_postalcards ON contact_postalcards.contact_id = contacts.id"
      ],
      :group => "companies.id"

      list.each do |item|
        p item.company_name, item.email_count, item.letter_count, item.postalcard_count
      end
Run Code Online (Sandbox Code Playgroud)