ruby-on-rails - 从 Rails 中保存的失败模型中恢复的最佳方法

标签 ruby-on-rails ruby error-handling rails-activerecord

我有一些代码可以从 twitter API 获取一些推文:

initial_tweets = get_tweets_in_time_range self.name, (Time.now-1.weeks), Time.now 

initial_tweets.each do |tweet|
    new_tweet = Tweet.new

    new_tweet.favorite_count = tweet.favorite_count 
    new_tweet.filter_level = tweet.filter_level 
    new_tweet.retweet_count = tweet.retweet_count 
    new_tweet.text = tweet.text 
    new_tweet.tweeted_at = tweet.created_at 

    new_tweet.created_at = DateTime.strptime tweet.created_at.to_s, '%Y-%m-%d %H:%M:%S %z' 

    new_tweet.save 
    # What happens on a failed save
end

如果保存失败,正确的回退是什么?正如评论所在的位置所指出的那样。谢谢你的帮助。

最佳答案

save只返回true或false,可以使用save!,如果记录无效会抛出异常。如果引发异常,您可以捕获它。

begin
  ....
  new_tweet.save!
rescue exception => e
  puts e.inspect
  #you can continue the loop or exit
end

正如@Stefan 所说,您可以将代码包装在一个事务中,如果一条记录保存失败,所有保存的记录都会回滚。我不建议您这样做,除非您真的希望每条记录都成功保存。

Tweet.transaction do
   initial_tweets = get_tweets_in_time_range self.name, (Time.now-1.weeks), Time.now 
initial_tweets.each do |tweet|
    new_tweet = Tweet.new
    ..... 
    new_tweet.created_at = DateTime.strptime tweet.created_at.to_s, '%Y-%m-%d %H:%M:%S %z' 

    new_tweet.save! # you have to add '!', once save failed, it will trigger rolls back.
  end
end

关于ruby-on-rails - 从 Rails 中保存的失败模型中恢复的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32730969/

相关文章:

Ruby:同时循环两个散列,其中一个是嵌套散列

python - 希望尝试缩进

ruby-on-rails - 在 active-model-serializers 中,如何限制从 has_many 关联返回的关联对象?

ruby-on-rails - RSpec:测试 Controller 时对模型的期望不起作用

ruby-on-rails - 如何通过 Icalendar gem 获取 RSVP 按钮

ruby-on-rails - 如何按时间在 rails 中订购多个 ActiveRecords?

ruby-on-rails - 使用 nginx 运行 capybara

ruby-on-rails - 使用Bundler安装 gem ==大问题

javascript - JavaScript程序,怎么了?

kotlin - 当你在协程范围内抛出异常时,协程范围是否可重用?