[英]Eager-load an association but ONLY a single column
我有一個這樣的自我參照協會:
class User
belongs_to :parent_user, class_name: "User"
has_many :child_users, class_name: "User", foreign_key: :parent_user_id
end
當我獲得用戶列表時,我希望能夠預先加載child_users
關聯,但我只需要其中的id
列。 我需要能夠在不引起 n+1 次查詢的情況下執行類似的操作,並且最好不必加載此 model 中的所有其他數據:
users = User.preload(:child_users)
users.map(&:child_user_ids)
上面的工作是將查詢限制為兩個查詢而不是 n+1,但是我將很多完整的對象加載到 memory 中,當我只關心那些子關聯上的id
本身時,我希望避免這種情況。
您不希望用於加載模型的預加載。 你想要 select 一個聚合。 這不是 ActiveRecord 查詢接口處理的內容,因此您需要使用 SQL 字符串或 Arel,並為您的數據庫使用正確的 function。
例如:
# This is for Postgres, use JSON_ARRAYAGG on MySQL
User.left_joins(:child_users)
.select(
"users.*",
'json_agg("child_users_users".id) AS child_ids'
)
.group(:id)
child_users_users
是.left_joins(:child_users)
創建的奇怪別名。
至少在 Postgres 上,驅動程序(PG gem)會自動將結果轉換為數組,但在其他數據庫上為 YMMV。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.