ruby-on-rails - 由于 ActiveRecord::StatementInvalid: SQLite3::SQLException: 无法回滚,Rails delayed_job 不起作用

标签 ruby-on-rails ruby

ActiveRecord::StatementInvalid: SQLite3::SQLException: 无法回滚 - 没有事务处于事件状态:回滚事务

我曾尝试在 heroku 中保存大量数据,但由于 30 秒的响应时间限制,我无法做到这一点,因此我决定使用 delayed_job。 但是,由于我从来没有使用过delayed_job所以我不知道如何解决以下错误

错误

NoMethodError(Word 的未定义方法“quizlet_save”(id:整数,group_id:整数,user_id:整数,答案:字符串,问题:字符串,标题:字符串,图像:字符串,created_at:日期时间,updated_at:日期时间,answer_language : string, question_language: string, favorites_count: integer, quizlet_id: integer, check_id: string)):

代码

   def index
@words = params[:tag].present?? Word.tagged_with(params[:tag]) : Word.all
@words =@words.all.includes(:tags)
@groups=Group.all
@search=@words.ransack(params[:q])
@search_result = @search.result #この行を修正
@search_result = @search_result.uniq
respond_to do |format|
  format.html
  format.json { render json: @search_result}
end
quizlet

结束

  def quizlet
      @response=[]
               response = Unirest.get "https://api.quizlet.com/2.0/search/sets/?client_id=7JH38T27zM&whitespace=1",
                       parameters:{ whitespace: true,q: "Duo3.0",term:100,sort:"most_studied"}
      res=response.body

      quizlet_ids=[]
        res["sets"].each do|res|
           quizlet_ids<<res["id"]
       end


      quizlet_words = Unirest.get "https://api.quizlet.com/2.0/sets/?client_id=7JH38T27zM&whitespace=1",
                            parameters:{ whitespace: true,set_ids:"#{quizlet_ids}"}

   quizlet_words.body.each do|words|
     words["terms"].each do|word|
      response=word
    response["quizlet_id"]=words["id"]
    response["check_id"]=word["id"]
    response["question_language"]= words["lang_terms"]
    response["answer_language"]  = words["lang_definitions"]
    @response<<response
    @response.each do|response|
      response
      Word.delay.quizlet_save(response["quizlet_id"],response["check_id"],response["term"],response["definition"],response["question_language"],response["answer_language"])
    end
  end
end

结束

型号

def quizlet_save(quizlet_id,check_id,question,answer,question_language,answer_language)
     unless Word.find_by(check_id:check_id)&&Word.find_by(quizlet_id:quizlet_id)
     Word.create(quizlet_id:quizlet_id,check_id:check_id,title:"Quizlet",question:question,answer:answer,user_id:1,tag_list:"English,duo3.0,Vocabulary",
              question_language:question_language,answer_language:answer_language)
    end
 end

  def quizlet_create_groups(quizlet_id,check_id)
   word=Word.find_by(check_id:check_id)
   unless word == nil
    checking_word=Word.find_by(quizlet_id:quizlet_id)
    group=Group.find_by(id: checking_word.group_id)
    if group==nil
       created_group=Group.new(user_id:1,title:"Quizlet",explanation:"Quizlet Duo3.0")
       created_group=created_group.save(validate: false)&&created_group
       word.update_attribute(:group_id,created_group.id)
     else
    word.update_attribute(:group_id,group.id)
    end
   end
 end

环境

  • ruby 2.3.1
  • ruby on rails 4.2.7
  • delayed_job_active_record (4.1.2)

最佳答案

我可以在 delayed_job 的 Github 问题上找到解决方案。delayed_job 存储库的所有者告诉我,你不能在 SQLite 中使用除 sucker_punch 之外的任何异步 gem。谢谢你的回答。

关于ruby-on-rails - 由于 ActiveRecord::StatementInvalid: SQLite3::SQLException: 无法回滚,Rails delayed_job 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003934/

相关文章:

ruby-on-rails - 在 Rails 中为命名空间路由添加别名

ruby - 如何使用 HAML 遍历数组?

ruby-on-rails - 迁移 Rails 6.0.34 -> 6.1 后,我无法在 config/environments/development.rb 中使用模型

ruby - ruby 中的结构与测试双重

ruby-on-rails - 需要帮助将 youtube_it 集成到我的 Rails 应用程序中

ruby-on-rails - Rails 使用 Koala 和 RSpec 测试 Facebook 方法

ruby-on-rails - 如何在 Rails 应用程序中对 Gems 加载时间进行基准测试

ruby-on-rails - Rails 构建 N 条记录的序列化对象

ruby-on-rails - 如何在连接模型中按列对关联模型进行排序(:through)

ruby-on-rails - 在 seeds.rb 中模拟时间戳