2014-07-07 191 views
0

預先加載我有三個型號:與多態關聯

User.rb 
belongs_to :profile, polymorphic: true 

Customer.rb 
has_one :user, as: :profile, dependent: :destroy 

Sale.rb 
belongs_to :customer 

我希望把所有與存儲在用戶模型客戶的電子郵件的銷售。做這個的最好方式是什麼?

到目前爲止,我有以下幾點:

Sale.all.includes(:customer) 

回答

0

你可以做到這一點是:

@sales = Sale.includes(:customer => :user).all 

它會得到所有與他們的客戶和型材銷售記錄嵌套到他們,你可以在Sale的物體上使用它:

@sales.first.customer.user.email #get the email for first Sale record. 

雖然,我認爲這將是一個代價高昂的會面hod,因爲我可以看到總共會有3個SQL查詢來獲取所有記錄,其中2個使用的是IN(),我認爲這有很大的代價。所以在這種情況下,我們最好用左連接。

@sales = Sale.joins('LEFT JOIN users ON sales.customer_id = users.profile_id AND users.profile_type = "Customer"') 

此查詢將獲得所有帶有嵌套用戶配置文件而沒有客戶數據/記錄的銷售記錄。如果您需要的客戶數據量太大,你可以隨時去與此:

@sales = Sale.joins('LEFT JOIN customers ON sales.customer_id = customers.id LEFT JOIN users ON customers.id = users.profile_id AND users.profile_type = "Customer"') 
+0

感謝您的快速反應,但我得到以下錯誤:#<引發ArgumentError:錯誤的參數數目(0 1)>時我嘗試@sales = Sale.includes(:customer =>:user).all – user3575214

+0

@ user3575214哦,你正在使用rails 4.試試'@sales = Sale.includes(:customer =>:user).all.to_a' –

+0

不,同樣的錯誤消息 – user3575214