如何在Rails中区分直接实例化和通过关联实例化



我有一个after_initialize回调,我希望在模型直接创建或实例化时发生,而不是通过在其他地方的关联加载。像这样:

after_initialize :check_status, if: "instantiated_directly?"

使MyModel.find(1)触发检查,但other_model.my_model不会。

状态是长流程的状态变量,它只需要在某个长时间运行的流程启动之前进行验证。如果进程似乎正在进行中,我想防止用户加载模型。由于其他原因,我希望仍然能够访问该模型中的属性

阻止读取可能不是改善此问题的最佳向量,试图超出其自身范围以确定如何加载明智想法的模型也不是。相反,我建议您只需添加一个验证,以确保可以在不干扰后台进程的情况下修改记录,就像……

validate :safe_to_edit?
def safe_to_edit?
  some_state_variable
end

您的模型还在这里公开了一个safe_to_edit?方法,该方法允许您的控制器或其他对象独立于检查验证来确定最佳行为,例如,如果您有一个客户端服务轮询来标记用户何时可以安全编辑,或者您想延迟响应并在后台作业中重试几秒钟,等等。

最新更新