首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别Rails 6大容量插入错误

如何识别Rails 6大容量插入错误
EN

Stack Overflow用户
提问于 2021-12-01 05:52:37
回答 1查看 442关注 0票数 0

我建立了以下关系:

代码语言:javascript
复制
user has_many quizzes
quiz belongs_to user
quiz has_many questions
question belongs_to quiz

App被设置为使用PostgreSQL。我试图使用insert_all!方法批量插入一堆记录

代码语言:javascript
复制
begin
  quiz = user.quizzes.create!(title: title, slug: slug)
  quiz_questions = params[:quiz][:questions].map! do |q|
    # creating an attribute hash here (code removed for conciseness of question)
  end
  result = quiz.questions.insert_all!(quiz_questions)

这引发了一个错误,被我的“捕获所有”块捕获。

代码语言:javascript
复制
rescue ActiveRecord::ActiveRecordError
  render json: { message: ['Something went wrong'] }, status: 500

正在运行的服务器控制台打印了以下消息:

代码语言:javascript
复制
TRANSACTION (0.9ms)  BEGIN
↳ app/controllers/quizzes_controller.rb:14:in `create'
Quiz Create (2.8ms)  INSERT INTO "quizzes" ("title", "user_id", "slug", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["title", "a quiz"], ["user_id", 1], ["slug", "a-quizk2DqYk"], ["created_at", "2021-12-01 05:00:05.800134"], ["updated_at", "2021-12-01 05:00:05.800134"]]
↳ app/controllers/quizzes_controller.rb:14:in `create'
TRANSACTION (1.6ms)  COMMIT
↳ app/controllers/quizzes_controller.rb:14:in `create'
Question Bulk Insert (0.6ms)  INSERT INTO "questions" ("question","a","b","c","d","score","answer","quiz_id") VALUES ('what is name', 'str', 'char', 'num', 'bool', 5, 'A', 1), ('die', 'yes', 'no', 'ok', 'what', 5, 'B', 1) RETURNING "id"
↳ (eval):6:in `block in insert_all!'
Completed 500 Internal Server Error in 153ms (Views: 0.2ms | ActiveRecord: 38.1ms | Allocations: 49609)

因此,我认为我没有正确地调用insert_all!,因为服务器只是在没有BEGINCOMMIT书签的情况下进行插入。另外,我想知道哪些错误被catch all块抛出并捕获。做insert_all!的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-12-01 10:56:02

您可以将大容量插入封装到事务中。

代码语言:javascript
复制
def bulk_insert
  ActiveRecord::Base.transaction do
    quiz = user.quizzes.create!(title: title, slug: slug)
    quiz_questions = params[:quiz][:questions].map! do |q|
      # creating an attribute hash here 
      # ... 
      # note that you could validate attribute manually
      raise ActiveRecord::Rollback if q.description.blank?
    end
    result = quiz.questions.insert_all!(quiz_questions)
  end
rescue ActiveRecord::Rollback => e
 puts e
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70179680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档