Ruby on rails Rails控制器-仅当内部的两个方法成功时执行操作(相互依赖的方法)

Ruby on rails Rails控制器-仅当内部的两个方法成功时执行操作(相互依赖的方法),ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我有一个控制器,它有一个名为“actions”的方法。当应用程序进入“example_action”方法时,它将实现第一个方法(1)update_user_表,然后(2)另一个update_userdeal_表。(两者都将读取和写入数据库) 我的问题是:在控制器中间超时的情况下,我希望避免用户表(通过方法1)被更新的情况,但是USERACTS表不是(通过方法2)< /强>。在我的应用程序中,对于移动用户,如果他们在连接互联网的地铁中,他们会启动通过“example_action”控制器的请求,成

我有一个控制器,它有一个名为“actions”的方法。当应用程序进入“example_action”方法时,它将实现第一个方法(1)update_user_表,然后(2)另一个update_userdeal_表。(两者都将读取和写入数据库)

<>我的问题是:<强>在控制器中间超时的情况下,我希望避免用户表(通过方法1)被更新的情况,但是USERACTS表不是(通过方法2)< /强>。在我的应用程序中,对于移动用户,如果他们在连接互联网的地铁中,他们会启动通过“example_action”控制器的请求,成功执行第一种方法(1),但随后进入隧道60秒,速度非常低((1)已经执行,但没有(2)。在我的应用程序中,如果Userdeal未更新,则完全不可能更新用户表(这会造成数据一致性问题…)

我需要这两种方法(1)和(2)是“相互依赖的”:如果一种不成功,另一种就不应该被执行。这是我能描述的最好的方式

在实践中,正如(1)首先发生的那样,如果(1)失败,那么(2)将不会执行。完美

问题是如果(1)成功而(2)未执行。我怎么能对Rails说,如果(2)未成功执行,那么我不想执行块“example\u action”中的任何内容。

可能吗

class DealsController < ApplicationController
  def example_action
    update_user_table
    update_userdeal_table   
  end

  private
  def update_user_table
    # update the table User so it needs to connect to internet and acces the distant User table
  end
  def update_userdeal_table
    # update the table UserDeal table so it needs to connect to internet and access the distant UserDeal table
  end
end
class DealsController
如果您使用的是
ActiveRecord
,您可以将方法移动到模型中,并在
事务
块中执行它们

class DealsController < ApplicationController
  def example_action
      // 'user' would have to be defined, or you could work with it as a class method in some way
      user.make_the_deal
  end
end

class User < ActiveRecord::Base
  def make_the_deal
    transaction do
      update_user_table
      update_userdeal_table
    end
  end

  def update_user_table
  end

  def update_userdeal_table
  end
end

但建议将事务放在模型中。

如果您使用的是
ActiveRecord
,则可以将方法移动到模型中,并在
事务
块中执行它们

class DealsController < ApplicationController
  def example_action
      // 'user' would have to be defined, or you could work with it as a class method in some way
      user.make_the_deal
  end
end

class User < ActiveRecord::Base
  def make_the_deal
    transaction do
      update_user_table
      update_userdeal_table
    end
  end

  def update_user_table
  end

  def update_userdeal_table
  end
end

在控制器中。但建议将事务放入模型中。

处理此问题的最佳方法是使用事务。您可以继续在控制器中使用事务,但这通常被认为是不好的做法

class DealsController < ApplicationController
  def example_action
    Deal.transaction do
      update_user_table
      update_userdeal_table   
    end
  end
end
class DealsController
因此,与前面提到的其他方法一样,您可以将这些方法移动到模型中的公共方法中,并用事务块将其包装

我发现了一篇关于rails交易的非常好的帖子。
处理此问题的最佳方法是使用事务。您可以继续在控制器本身中使用事务,但这通常被认为是不好的做法

class DealsController < ApplicationController
  def example_action
    Deal.transaction do
      update_user_table
      update_userdeal_table   
    end
  end
end
class DealsController
因此,与前面提到的其他方法一样,您可以将这些方法移动到模型中的公共方法中,并用事务块将其包装

我发现了一篇关于rails交易的非常好的帖子。

非常感谢。当在控制器内使用时,我得到错误“>未定义的方法“transaction”表示#“对不起,我想我知道为什么我必须进行交易。transaction我不想将其放在用户模型内(但将其放在交易控制器内)因为它不仅涉及/影响deal表,而且还涉及userdeal tale和许多其他表…由于代码块位于deal controller中,我将deal.transaction放入其中。现在尝试一下。谢谢。我创建了一个新问题,因为它变得有点复杂。我需要添加第三个必须“绑定”的方法对于其他人来说,这不是与数据库相关的东西,而是一个显示(rails ujs的东西)。非常感谢。当在控制器中使用它时,我得到错误“>未定义的方法“transaction”for#“对不起,我想我知道为什么我必须做交易。交易我不想把它放在用户模型中(但要放在交易控制器中)因为它不仅涉及/影响deal表,而且还涉及userdeal tale和许多其他表…由于代码块位于deal controller中,我将deal.transaction放入其中。现在尝试一下。谢谢。我创建了一个新问题,因为它变得有点复杂。我需要添加第三个必须“绑定”的方法对其他人来说,这不是与数据库相关的东西,而是一个显示(rails ujs的东西)。谢谢Larson,但Shaun先发送了正确的答案。非常感谢链接和您的帮助。我有一个新问题扩展了这个问题:谢谢Larson,但Shaun先发送了正确的答案。非常感谢链接和您的帮助。我有一个新问题扩展了这个问题: