Rails使用数组

时间:2016-11-07 00:30:02

标签: ruby-on-rails refactoring ruby-on-rails-5

我在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))

有更好地做到这一点的方法吗?

2 个答案:

答案 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)

第二行将使用给定数组Profileprofile_ids模型中搜索 它将生成类似SELECT * FROM profile WHERE id IN (1,2,3..)

的SQL

修改:另一种形式:@profiles = Profile.find(profile_ids)