加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Ruby On Rails控制器方法中使用事务

发布时间:2020-12-17 03:24:32 所属栏目:百科 来源:网络整理
导读:我喜欢 Ruby On Rails,每天我都在学习和提高自己的技能.目前我正在开发一个由多个客户端使用的应用程序,我想重构我的代码,这样我就可以对代码的质量充满信心. 我正在努力实现异常处理和使用事务.我有一个控制器,必须创建和更新三个对象.以简化我的情况. 在我
我喜欢 Ruby On Rails,每天我都在学习和提高自己的技能.目前我正在开发一个由多个客户端使用的应用程序,我想重构我的代码,这样我就可以对代码的质量充满信心.

我正在努力实现异常处理和使用事务.我有一个控制器,必须创建和更新三个对象.以简化我的情况.

在我的控制器中:

def update
  @user.change_value_x  #(1) effects Model 'User'
  if condition == y 
    @user.create_coupon #(2) effects Model 'Coupon' via Model 'User' 
  end
  create_a_history_item #(3) effect Model 'History' 
end

第一个(1)和第二个方法(2)位于用户模型中,第三个方法(3)也由其他控制器使用,位于/ lib目录中的Module中.所有方法都在更新/保存/创建数据库项.

如果其中一个操作失败,则所有数据库操作都应回滚并提供有关该问题的反馈.

我知道’交易’是一个很好的解决方案,我也有红色,在不同的帖子中,交易不应该在控制器中使用.
问题:这是为什么?

所以我猜这段代码不是实现事务的正确方法.

def update
  ActiveRecord::Base.transaction do
    @user.change_value_x  #(1) effects Model 'User'
    if condition == y 
      @user.create_coupon #(2) effects Model 'Coupon' via Model 'User' 
    end
    create_a_history_item #(3) effect Model 'History'
  end
  rescue
  #some code that gives feedback to user about the problem
end

处理这个问题的最佳/正确方法是什么?

解决方法

事务应尽可能保持在模型级别,因为它们与模型有关,而与逻辑无关.控制器中的事务就像控制器中的SQL请求:它感觉不合适.

话虽如此,您的解决方案没有任何问题,但是在您的模型(或服务层)上使用方法可能有助于在控制器中保持清洁?例如,User#update_x_and_create_coupon和User#update_x_and_create_history_item等方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读