2015-02-24 25 views
2

我正在爲我的數據庫表開發一個使用ActiveRecord模型的rails 4應用程序。 主要問題是我的模型非常複雜,當我做主對象的索引時,我想顯示大量信息。如何將ActiveRecord SQL查詢轉換爲散列數組而無需實例化ActiveRecord對象?

例如,假設我有以下表和列:

Person:  name(string) 
Address:  address(string), person_id(int) 
EmailAddress: email(string), person_id(int) 
Email:  spam (boolean), email_address_id(int) 

和關係:

person  has_many: :email_addresses 
person  has_one: :address 
email_address has_many: :emails 

現在我想顯示如下信息

person.name 
person.address.name 
person.email_addresses.count 
person.email_addresses.map do |email_address| 
    email_address.email.where(spam: false).count 
end 

主要問題是我有大量的記錄,我不想實例化所有的記錄(因爲這個,我有一些內存問題)。因此,我想知道如何直接做這種事情來獲得散列或數組的數組。

我設法使用pluck開頭:

Person.joins(:address).pluck('persons.name, addresses.address') 

問題與計數部分開始。

有人遇到過這種情況嗎?有沒有辦法做到這一點,而無需編寫完整的SQL查詢?

+0

什麼是你使用的數據庫? – 2015-02-24 16:12:51

+0

嗨。 我有一個postgres數據庫。 – 2015-02-24 18:40:40

回答

2

對於複雜查詢,您不能使用pluck,但您始終可以使用select來獲取所需的列。首先你加入你需要的所有表格。注我加入了emails表兩次,第二次加上spam: false的條件。然後,你定義的列,直接從表或COUNT「版,在您的select聲明:

persons = Person.joins(:address, email_addresses: :emails). 
    joins('INNER JOIN emails not_spammy_email_addresses ON emails.email_address_id = email_addresses.id AND emails.spam = 0'). 
    select('persons.name, addresses.address AS address_address, 
      COUNT(email_addresses.id) AS email_addresses_count, 
      COUNT(not_spammy_email_addresses.id) AS not_spammy_email_addresses_count') 

然後打電話給你的結果的列是這樣的:

person = persons.first 
person.name 
person.address_address # note I'm not using *address* to prevent conflict with the model Adress 
person.email_addresses_count 
person.not_spammy_email_addresses_count 

我相信這是儘可能您可以通過active_record和單個查詢獲得,但我希望看到其他方法。例如,如果您使用Arel,則此查詢會感覺不到SQLish

相關問題