【问题标题】:Query optimization in associated models关联模型中的查询优化
【发布时间】:2015-07-07 11:02:54
【问题描述】:

我有一个User 模型

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

Profile 表有两列命名,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

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

【问题讨论】:

  • 你确定是has_many :skills?不应该是has_and_belongs_to_many :skills吗?否则,无法在 User 实例之间共享技能。
  • 是的,user has_many skills,我知道这有点奇怪。但是这些技能不是预定义的,也不是在其他用户之间共享的。每个用户都有自己的个人技能,不会与其他人分享。

标签: ruby-on-rails postgresql rails-activerecord


【解决方案1】:

因为您的技能只属于一个用户,您可以先获取属于所提供技能 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]
        )

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多