使用same:id在数据库中创建多个记录

时间:2015-02-18 09:59:55

标签: ruby-on-rails activerecord psql

我正在尝试在我的rails应用上创建相同记录的多个实例。我有testsquestionstests可以有多个questions

我也有testsessions。我的testsessions表看起来像这样:

id | user_id | test_id | question_id | answer

我正在尝试让控制器创建相同testsession的多个实例,唯一不同的是question_id,它将从具有相同test_id的问题中提取出来。 testsession。

目前我在控制器中有这个:

def new
  @test = Test.find(params[:test_id])
  @testsession = @test.testsessions.new
  @testsession.user_id = current_user.id

  @testsession.save
  @questions = @test.questions
  redirect_to action: :index
end

但我不知道如何根据question_id创建多个实例。

我有一个我想要使用的question_id数组:

@questions = Question.where(test_id: @test.id).pluck(:id)

但是我不知道如何将它放入控制器...最后我希望表格看起来像这样:

id | user_id | test_id | question_id | answer
1  |    1    |    1    |      1      |
1  |    1    |    1    |      2      |
1  |    1    |    1    |      3      |
1  |    1    |    1    |      4      |

答案总是空的,因为用户稍后会使用update

输入

非常感谢任何关于如何做到这一点的想法!

1 个答案:

答案 0 :(得分:2)

我想我明白你要实现的目标:你有一个有很多问题的测试。当有人进行测试时,您需要提前为每个问题创建一个测试会话。

试试这个:

def new
  @test = Test.find(params[:test_id])

  @test.questions.each do |question|
    @test.testsessions.create user: current_user, question: question
  end

  redirect_to action: :index
end

作为旁注:new控制器操作并不是创建事物的好地方,因为new(通常)可通过HTTP GET请求访问。

暂时假设您撰写的应用可供Google访问。如果Google找到此控制器操作的链接,它将访问它并意外创建新的测试会话对象。可能很多次。

这就是为什么在应用中创建或更改某些内容的控制器操作只能通过其他方法访问,例如POST - 搜索引擎和其他机器人不会触及这些操作。

即使您的应用无法公开访问,也是一个很好的习惯。