2010-08-17 77 views
0

我有幾個類似的模型ContactEmail,ContactLetter等。如何獲得唯一的:在軌道中的虛擬屬性組?

每一個belongs_to聯繫人

每個聯繫人belongs_to公司

所以,我所做的就是創建ContactEmail虛擬屬性:

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

    return contact.company_name 

    end 

問:我怎樣才能得到一個如果我有一組ContactEmails對象(例如,來自find(:all)方法),那麼容易列出所有company_name(無重複)?

當我嘗試使用統計信息gem在ContactEmail.company_name上執行搜索時,例如,我收到一個錯誤消息,說明company_name不是ContactEmail的列。

回答

0

假設你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')

在一個虛擬屬性,我認爲你必須檢索整套和使用紅寶石(未經測試)

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版本的查詢語法並引用列本身。

+0

我看到... company_name也是聯繫人的虛擬屬性,但我認爲沒關係。 – Angela 2010-08-17 16:26:55

+0

會不會有辦法,因爲無論如何我必須通過company_names來計算屬於給定company_name的實例的總數,有點像使用GROUP? – Angela 2010-08-17 19:26:10

+0

company_name不是聯繫人列。它也是一個虛擬屬性。所以這意味着我必須做那麼長的事情? – Angela 2010-08-17 23:43:06

相關問題