我正在构建一个简单的rails应用程序作为学习项目,并且无法确定如何实际使用一对多查询的结果。据我所知,查询本身很好,但我似乎无法使用结果。
这是我的数据库架构:
create_table "tests", force: true do |t|
t.string "name"
t.integer "subject_id"
t.string "description"
end
create_table "questions", force: true do |t|
t.text "question"
t.integer "test_id"
end
create_table "answers", force: true do |t|
t.integer "question_id"
t.text "answer"
end
以下是我的模特:
class Test < ActiveRecord::Base
has_many :questions
belongs_to :subject
end
class Question < ActiveRecord::Base
has_many :answers
belongs_to :test
end
class Answer < ActiveRecord::Base
belongs_to :questions
end
现在,在我正在使用的控制器中,我正在使用此Active Record查询设置一个实例变量(现在硬编码test_id):
@questionSet = Question.includes(:answers).where("test_id = ?", 1)
然后我可以从视图中获取所有问题,但我如何得到答案呢?这就像我需要一个嵌套的for循环 - 一个循环问题,然后另一个得到所有答案,其中question_id匹配问题对象中的id。这些活动记录对象是一个可以使用的熊。
这是我所拥有的,它将输出问题,但我无法得到输出的答案:
<% @questions.each do |q| %>
<%= q.question %>
<!--need to loop through answers and output answers for this question (where quesiton_id)-->
<br>
<br>
<% end %>
如果在answer_id = q.id?
中,我如何遍历我的答案活动记录对象并输出它们答案 0 :(得分:3)
问题has_many
答案。由于您已设置has_many
关系,因此rails会在问题模型中为您answers
创建一个动态方法。在问题实例上调用answers
方法后,您将获得该特定问题的所有答案。
例如:
q = Question.find(10) ## Returns Question record with id 10 from questions table
q.answers ## Returns all the answers mapped to question with id 10
q.answers
将导致如下查询:
SELECT "answers".* FROM "answers" WHERE "answers"."question_id" = ? [["question_id", 10]]
在您的情况下,您可以修改视图代码,如下所示:
<% @questions.each do |q| %>
<%= q.question %>
<% q.answers.each do |a| %>
<%= a.answer %>
<% end %>
<br>
<br>
<% end %>