我有一個這樣的自我參照關聯:
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 查詢的情況下執行此類操作,并且最好不必加載此模型中的所有其他資料:
users = User.preload(:child_users)
users.map(&:child_user_ids)
id上面的方法是將查詢限制為兩個查詢而不是 n 1,但是我將很多完整的物件加載到記憶體中,當我只關心這些子關聯上的自身時,我希望避免這些物件。
uj5u.com熱心網友回復:
您不想要用于加載模型的急切加載。您要選擇一個聚合。這不是 ActiveRecord 查詢介面處理的內容,因此您需要使用 SQL 字串或 Arel 并為您的資料庫使用正確的函式。
例如:
# 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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471113.html
標籤:轨道上的红宝石 ruby-on-rails-5 急切加载
