簡體   English   中英

在Rails中,僅當關聯不為零時,如何急於加​​載關聯?

[英]In Rails, How to Eager Load an Association only if the Association is not nil?

我正在嘗試使用public_activity gem創建活動日志。 加載特定用戶的活動時,我使用以下命令:

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

在這里, awardunit協會不會一直存在。 由於我跟蹤多個模型,因此有時跟蹤的模型沒有獎勵單元。 因此,我們如何才能渴望僅在關聯可用時加載它?

PS:我想獲得所有活動...在該列表中,可以有來自不同模型的活動。 有些型號沒有將Awardunit作為關聯。 因此,以上代碼給出了一個錯誤,指出該型號沒有Awardunit!

PS:如果我使用問題中顯示的代碼,則會出現類似“在Gold上找不到名為'awardunit'的協會;也許您拼錯了密碼?”的錯誤。 問題是我無法刪除正在加載的award_unit,因為某些可跟蹤對象具有awardunit

包括多態關聯,例如

PublicActivity::Activity.includes(:trackable)

將返回

  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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM