Rails - 使用一对多查询的结果

时间:2014-03-06 20:37:30

标签: ruby-on-rails activerecord

我正在构建一个简单的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?

中,我如何遍历我的答案活动记录对象并输出它们

1 个答案:

答案 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 %>