2013-12-20 23 views
1

我試圖使用public_activity gem創建一個活動日誌。當我打開一個特定用戶的活動,我用下面的命令:在Rails中,如何在只有協會不是零的情況下才能加載協會?

@activity = PublicActivity::Activity.order("created_at desc").where(owner_id: @awardleader.authentication.id).includes(:trackable, trackable: :awardunit) 

在這裏,awardunit協會不會在那裏所有的時間。由於我跟蹤了幾個模型,有時跟蹤的模型沒有獎勵單元。那麼,我們如何才能加載協會只有當它可用?

PS:我想要獲得所有活動......在該列表中,可以有來自不同模型的活動。有些模型沒有Awardunit作爲協會。所以,上面的代碼給出了一個錯誤,說沒有該模型的Awardunit! PS:如果我使用我在我的問題中顯示的代碼,它會給我一個這樣的錯誤「在黃金上找不到關聯名'awardunit';或許你拼錯了它?」。問題是我不能刪除加載award_unit因爲一些trackables已經

PublicActivity::Activity.includes(:trackable) 

awardunit

+0

你想找到所有的活動,或只有那些有可跟蹤AwardUnit? – janfoeh

+0

@janfoeh所有活動......在該列表中,可以有來自不同模型的活動。有些模型沒有Awardunit作爲協會。所以,上面的代碼給出了一個錯誤,說沒有該模型的Awardunit! – THpubs

回答

1

包括多態關聯,因爲將返回

  1. 的所有活動,他們是否有相關的可追蹤或不。如果沒有可跟蹤的,則只會加載其他任何內容。
  2. 包括任何種類的可跟蹤的,其存在,而無論其類型

的它做通過產生爲數據庫LEFT OUTER JOIN

聲明的關聯是多態的,如

class PublicActivity::Activity < ActiveRecord::Base 
    belongs_to :trackable, polymorphic: true 
end 

增加了兩個欄,您activities數據庫表,trackables_typetrackables_id。你可以在你的查詢中使用這些。

如果你想只有那些任何種可跟蹤有關的活動,使用

PublicActivity::Activity.includes(:trackable).where.not(trackable_type: nil) 

如果你想獲得只有具有與之關聯的AwardUnit活動,使用

PublicActivity::Activity.includes(:trackable).where(trackable_type: :award_unit) 
+0

其實我需要它,渴望加載:award_unit只有:award_unit可用於該模型。 – THpubs

+0

如果我使用我在我的問題中顯示的代碼,它會給我一個這樣的錯誤:「在黃金上找不到關聯名'awardunit';也許你拼錯了它?」。問題是我無法刪除加載award_unit,因爲一些trackables有獎勵單元 – THpubs

+1

@EApubs,但這就是它的開箱即用:如果可用,它將被包含 - 否則它什麼也不做。因爲'.includes(:trackable,trackable::awardunit)'不起作用,所以會出錯。改用'.includes(:trackable)'。如果他們是'AwardUnits',則不能**只包含'包含'可跟蹤信息,不管其類型如何,您只能包含所有**可跟蹤信息。 – janfoeh