关联模型中的查询优化

Query optimization in associated models

我有一个User模型

class User < ActiveRecord::Base
  has_many :skills
  has_one :profile
end

Profile table 有两列命名为 age & experience

现在,我有一个搜索表单,其中传递的参数是:

params[:skill_ids] = [273,122,233]
params[:age] = "23"
params[:experience] = "2"

我必须搜索所有用户,其中用户的技能满足任何 params[:skill_ids] 以及用户的个人资料、他们的年龄和经验。

我是否必须像这样循环:

users = []
User.all.each do |user|
  if (user.skills.collect{|s| s.id} & params[:skill_ids] ) > 0
     // skip other  parts
     users << user
  end
end

或者,你们有更好的解决方案吗?

试试这个:

@users = User.includes(:skills).where(["skills.id in (?)", params[:skill_ids]]).all

因为您的技能只属于一个用户,您可以先获取属于提供的技能 ID 的所有用户,然后按其他条件过滤它们:

matching_users = User.includes(:skills, :profile)
  .where(["skills.id in (?) AND profile.age = ? AND profile.experience = ?", 
          params[:skill_ids],
          params[:age].to_i, 
          params[:experience].to_i]
        )