我有 4 個模型
module Vehicle
has_many :routes
end
module Route
has_many :route_users
belongs_to :vehicle
end
module RouteUser
belongs_to :route
belongs_to :user
end
module User
belongs_to :route_user
end
我的目標是通過;回傳最新的驅動程式(a user) 。aggregate.rb具體來說,我需要 user id, first_name, last_name。
attributes = {
id: vehicle.id,
... other attributes ...
}
attributes.merge!(
driver: {
id: vehicle.routes.last.route_users.last.user.id,
first_name: vehicle.routes.last.route_users.last.user.first_name,
last_name: vehicle.routes.last.route_users.last.user.last_name
}
) if vehicle.routes.present? && vehicle.routes.last.route_users.present?
如您所見,.merge!加載大量資訊并顯著減慢aggregate.rb回傳速度。有什么辦法可以優化這個回報,讓它更快?我錯過了什么嗎?
uj5u.com熱心網友回復:
您可以改進您的用戶模型以使查詢更容易。
class User < ApplicationRecord
has_many :route_users
has_many :routes, through: :route_users
has_many :vehicles, through: :routes
end
而當從一側查詢很大時,最好的方法是兩個反轉邏輯,并從用戶進行查詢,例如:
先取last_user_drive,然后用他的欄位合并成屬性
last_user_driver = User.joins(routes: :vehicle).where(vehicle: {id: vehicle.id}).order('routes.created_at').last
...
attributes.merge!(
driver: {
id: last_user_driver.id,
first_name: last_user_driver.first_name,
last_name: last_user_driver.last_name
}
) if last_user_driver.present?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472674.html
