Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 关联模型中的查询优化_Ruby On Rails_Postgresql_Rails Activerecord - Fatal编程技术网

Ruby on rails 关联模型中的查询优化

Ruby on rails 关联模型中的查询优化,ruby-on-rails,postgresql,rails-activerecord,Ruby On Rails,Postgresql,Rails Activerecord,我有一个用户型号 class User < ActiveRecord::Base has_many :skills has_one :profile end 我必须搜索用户技能符合任何参数[:skill_id]的所有用户,还必须搜索用户的个人资料、年龄和经验 我是否必须经历这样的循环: users = [] User.all.each do |user| if (user.skills.collect{|s| s.id} & params[:skill_ids] )

我有一个
用户
型号

class User < ActiveRecord::Base
  has_many :skills
  has_one :profile
end
我必须搜索用户技能符合任何
参数[:skill_id]
的所有用户,还必须搜索用户的个人资料、年龄和经验

我是否必须经历这样的循环:

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.all.each do | User|
if(user.skills.collect{s|s.id}¶ms[:skill_id])>0
//跳过其他部分
用户尝试以下方法:

@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]
        )

你确定它有很多技能吗?它不应该是有很多技能的吗?否则,技能无法在用户实例之间共享。是的,
用户有很多技能,我知道这有点奇怪。但是这些技能不是预先定义的,也不是在其他用户之间共享的。每个用户都有自己的技能,而不是分享给其他人。
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]
        )