Rails 4.2:如何强制重新加载模型定义?

3
我们的Rails 4.2应用程序中有一个名为payment_request.rb的模型,并且我们希望在其控制器payment_requests_controller.rb中使用before_action来强制重新加载它。是否有一种方法可以重新加载它?

这似乎是一个经典的XY问题:你为什么想要这样做?有更好的方法吗?我很难想象在生产代码中我会真正想要这样做的情况,而我能想到的那些情况都足够奇特,以至于没有人不自己想到twonegatives' answer就应该尝试它。(请注意,在dev最近的Rails 应该自动执行此操作,当源文件发生更改时。) - David Moles
3个回答

4

@Mariah建议您使用一种重新加载模型类实例的方法,但如果您真正想要重新加载类的定义,可以使用以下技巧:

before_action :reload_model

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

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

当某些常量值需要更新时(因为它们在第一次加载类时填充并随时间变化),重新加载类可能很有用。但是,在您的应用程序正在运行时发生此情况时,最好考虑将基于常量的解决方案更改为更合适的解决方案。


无法从应用程序的其他部分访问PaymentRequest。重新加载会影响其他用户吗?我们的应用程序是多租户的。 - user938363
@user938363,我认为这取决于您的应用程序是如何托管的(线程、进程、Web和应用服务器等)以及使用方式。我不确定您所说的多租户具体指什么,但您肯定存在风险。如果除了类重新加载之外还有其他方法,我建议您使用它们。 - twonegatives

3

如果您想重新加载模型类,可以使用以下方法

ModelClassName.reset_column_information

有关reset_column_information的API文档


0
你想在什么时候重新加载模型?不确定为什么你想在 before_action 中重新加载,你可以在任何方法中简单地调用 "@payment_request.reload"。
如果你想在 before_action 中实现它,你需要在控制器中添加这个 before_action。你还需要定义一个被调用的函数。例如,
before_action :reload

def reload 
    @payment_request.reload
end

2
我们正在寻找重新加载类定义。 - user938363

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接