Rails select 记录使用数组
Rails select records using an array
我的 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))
。
有没有办法更优雅地做到这一点?
profile_ids = current_user.ratings.order(speed: :desc).pluck(:profile_id)
@profiles = Profile.where(:id => profile_ids)
第二行将在 Profile
模型中搜索给定数组 profile_ids
它会生成一个 SQL 像 SELECT * FROM profile WHERE id IN (1,2,3..)
编辑:另一种形式:@profiles = Profile.find(profile_ids)
首先选择配置文件 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
我的 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))
。
有没有办法更优雅地做到这一点?
profile_ids = current_user.ratings.order(speed: :desc).pluck(:profile_id)
@profiles = Profile.where(:id => profile_ids)
第二行将在 Profile
模型中搜索给定数组 profile_ids
它会生成一个 SQL 像 SELECT * FROM profile WHERE id IN (1,2,3..)
编辑:另一种形式:@profiles = Profile.find(profile_ids)
首先选择配置文件 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