我在ProfilesController#Index
:
@profiles = []
profile_ids = current_user.ratings.order(speed: :desc).pluck(:profile_id)
profile_ids.each do |id|
@profiles << Profile.find(id)
end
我试过这样做:
@profiles = current_user.ratings.order(speed: :desc).pluck(:profile_id).each do |id|
Profile.find(id)
end
但出于某种原因,这只会将:profile_id
的值放入@profiles
而不是我想要的实际Profile(find(id))
。
有更好地做到这一点的方法吗?
答案 0 :(得分:3)
首先选择个人资料ID,然后执行Profile.where(id: profile_ids).to_a
之类的操作的问题在于,您无法按预期顺序获得结果。
另一方面,您的查询的主要问题是您将执行N + 1个查询,N的大小为profile_ids
。以下查询应仅执行两个,并按预期顺序为您提供配置文件:
profiles = current_user.ratings.order(speed: :desc).includes(:profile).map(&:profile)
有关N + 1个查询的更多信息here
答案 1 :(得分:0)
profile_ids = current_user.ratings.order(speed: :desc).pluck(:profile_id)
@profiles = Profile.where(:id => profile_ids)
第二行将使用给定数组Profile
在profile_ids
模型中搜索
它将生成类似SELECT * FROM profile WHERE id IN (1,2,3..)
修改:另一种形式:@profiles = Profile.find(profile_ids)