【问题标题】:Rails 4.2: How to force to reload model definition?Rails 4.2:如何强制重新加载模型定义?
【发布时间】:2016-03-23 04:49:59
【问题描述】:

在我们的 Rails 4.2 应用程序中有一个模型 payment_request.rb,我们想在其控制器 payment_requests_controller.rb 中强制使用 before_action 重新加载它。有没有办法重新加载?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    @Mariah 建议您重新加载模型类的实例,但如果您的意图是真正重新加载类的定义,您可以使用以下技巧:

    before_action :reload_model
    
    def reload_model
      Object.send(:remove_const, :PaymentRequest)
      load 'app/models/payment_request.rb'
    end
    

    请注意在类重新加载期间无法从应用程序的同一实例的其他部分访问 PaymentRequest 等副作用。实际上我怀疑在你的控制器代码中这样做是否正确。

    当一些常量值需要更新时,重新加载一个类可能很有用(因为它在第一个类加载时填充并在一段时间内更改)。但是如果在您的应用程序运行期间发生这种情况,您最好考虑将基于常量的解决方案更改为更合适的解决方案。

    【讨论】:

    • ` 无法从应用程序的同一实例的其他部分访问 PaymentRequest ` - 其他用户会受到重新加载的影响吗?我们的应用是多租户的。
    • @user938363 我相信这取决于您的应用程序的托管方式(线程、进程、Web 和应用程序服务器等)和使用方式。我不确定你所说的多租户到底是什么意思,但你肯定有风险。如果除了类重新加载之外还有其他方法,我建议使用它们。
    【解决方案2】:

    如果你想重新加载模型类,你可以使用这个

    ModelClassName.reset_column_information
    

    reset_column_information 上的 API 文档

    【讨论】:

      【解决方案3】:

      您希望模型何时重新加载?不确定为什么要在 before_action 上重新加载,您可以简单地以任何方法调用“@payment_request.reload”

      如果你想在之前的动作中使用它,你必须在你的控制器中添加这个 before_action。您还必须定义它调用的函数。例如,

      before_action :reload
      
      def reload 
          @payment_request.reload
      end
      

      【讨论】:

      • 我们正在寻找重新加载类定义。
      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2012-11-10
      • 2010-10-20
      相关资源
      最近更新 更多