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