急于使用Rails查询加载

时间:2014-10-23 18:44:34

标签: ruby-on-rails activerecord eager-loading

在我的rails应用中,项目有很多步骤,步骤可以有问题

我想写一个检查项目是否有任何问题的方法,并返回带问题的步骤的id。

目前,我在 project.rb

中有以下内容
 def step_with_question
    question_step = ""
    steps.order(:published_on).each do |step|
      if step.question
        question_step = step.id
      end
    end
    return question_step
  end

但我认为这是低效的,并且认为通过急切加载可能有更快的方法(这会为项目中的每个步骤创建一个查询)。有没有人有关于如何做到这一点的建议?

2 个答案:

答案 0 :(得分:1)

您可以使用joins仅返回实际与:steps关联的关联:questions

@project = Project.joins(steps: :questions).order('steps.published_on').find(id)

此查询将仅返回实际具有关联问题的项目步骤。您现在可以安全地遍历步骤记录并返回或使用step.id

@project.steps.each do |step|
  question_step = step.id
  # do something with the question_step
end

答案 1 :(得分:0)

我不明白你的代码到底做了什么,但是如果你想从一个步骤访问一个问题,你可以使用方法includes

project = Project.find(id) # Get a product just to show how it works
# To tell Rails to make a single query when you want to
# access the questions, do something like this:
steps_with_questions = project.steps.includes(:question)

这样,当您尝试访问某个问题时,它就已经加载了。

使用这些的最佳方法是为step.rb编写一个范围,如下所示:

scope :with_questions, lambda { includes :questions }

现在你只需要打电话:

project.steps.with_questions

使代码更容易阅读。

编辑:您的代码如下所示:(没有我之前提到的范围)

 def step_with_question
    question_step = ""
    steps.order(:published_on).includes(:question).each do |step|
      if step.question
        question_step = step.id
      end
    end
    return question_step
  end