标签:activerecord transactions ruby-on-rails mysql
我想做这样的事情:
["START", "a", "b", "c", "STOP", "START", "d", "e", "STOP"].each do |message|
if message == "START"
Transaction.begin
elsif message == "STOP"
Transaction.commit if Transaction.active?
else
begin
Message.create!(body: message)
rescue
Transaction.rollback
end
end
end
简而言之,我有一个“消息”流,我想将其中的部分事务化.
每当流上出现“开始”时,就会开始新的事务.每当出现“停止”时,就提交事务.
我正在为交易而苦苦挣扎.
我可以看到我可以做ActiveRecord :: Base.transaction … …结束,但是在这种情况下,除非我将所有内容进行批处理,否则这将无法工作,由于流的原因,这里是不可能的.
我看到有一个事务记录管理器埋在ActiveRecord中,我可以潜在地使用它(https://github.com/rails/rails/blob/0d76ab9c6f01e6390ba8878a296ff9d3ac6b9aa8/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb),但是我无法通过它进行测试.
我认为问题的一部分也是RSpec的事务处理工具的干扰,尽管禁用这些工具似乎也无法解决问题.
任何帮助,将不胜感激.
谢谢
解决方法:
我会这样做:
messages.chunk {|value| value != 'START' && value != 'STOP'}.each do |is_data, bodies|
if is_data
Message.transaction do
bodies.each {|body| Message.create(body: body)}
end
end
end
第一步是使用chunk
对消息进行分组.其输出是成对的数组.如果该对的第一个值是true,则第二个值是主体数组,如果不是,则这些主体只是true false.如此重组了数据之后,使用现有的交易方法就变得微不足道了.
标签:activerecord,transactions,ruby-on-rails,mysql 来源: https://codeday.me/bug/20191120/2044262.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。