簡體   English   中英

急切加載一個關聯但只有一個列

[英]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.

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