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