在rails中进行n + 1查询,需要解决方案

时间:2017-12-02 09:22:51

标签: ruby-on-rails

下面给出了我的应用程序中的模型。我试图找到所有匹配键盘的公司。例如。如果我在我的搜索框中键入java,它应该让我找到匹配和键盘的所有公司。

class User < ActiveRecord::Base
  has_one :company
end

class Company < ActiveRecord::Base
  has_many :jobs
  belongs_to :user
end

class Job < ActiveRecord::Base
  belongs_to :company
  has_many :key_skills, dependent: :destroy
  accepts_nested_attributes_for :key_skills, reject_if: :all_blank, allow_destroy: true
end

class KeySkill < ActiveRecord::Base
  belongs_to :job
end

我所遵循的步骤是,

步骤1:找到与输入的单词匹配的所有键盘。 (例如:java)

@matched_keyskills = KeySkill.where('name like ?','java')

由于我在作业和键盘之间存在关联,因此作业has_many key_skills和key_skills belongs_to job。我可以迭代 @matse_keyskill.each做| k |   k.job.company 结束

获取公司记录。但是,当我尝试这种方法时,它会导致n + 1查询,公司名称也会重复出现。

有没有办法让我只能获得显示页面上显示的公司名称,然后通过点击公司显示与之关联的工作。 另外请让我知道db模型和关联是否正确才能实现它。

1 个答案:

答案 0 :(得分:1)

您可以使用“joins”和“inclue”删除n + 1查询:

试试这个,它会根据您的需要为您提供所有公司的列表。

Company.joins(key_skill: :job).where('key_skill.name like ?','java')

您也可以使用预先加载。

http://railscasts.com/episodes/22-eager-loading