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/