【问题标题】:Rails after_save callback to create an associated model based on column_changed?Rails after_save 回调创建基于 column_changed 的​​关联模型?
【发布时间】:2009-03-31 17:51:18
【问题描述】:

我有一个带有状态列的 ActiveRecord 模型。当模型与状态更改一起保存时,我需要将状态更改以及负责更改的人员写入历史文件。我在想 after_save 回调会很好用,但我不能使用 status_changed?动态方法来确定历史写入是必须执行的。如果模型已保存但状态未更改,我不想写入历史记录。我现在处理它的唯一想法是使用实​​例变量标志来确定 after_save 是否应该执行。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord callback


    【解决方案1】:

    自问题发布以来这可能已经改变,但 after_save 回调应该有 *_changed? 动态方法可用并正确设置:

    class Order
      after_save :handle_status_changed, :if => :status_changed?
    end
    

    class Order
      after_save :handle_status_changed
      def handle_status_changed
        return unless status_changed?
        ...
      end
    end
    

    使用 Rails 2.3.2 对我来说可以正常工作。

    【讨论】:

      【解决方案2】:

      改用before_save 回调。然后您可以访问新旧状态值。回调被包装在一个事务中,所以如果保存失败或被另一个回调取消,历史写入也将被回滚。

      【讨论】:

      • before_save 不允许创建记录(到历史表中)
      【解决方案3】:

      我看到了两种解决方案:

      1. 如你所说:添加变量标志并在设置时运行回调。

      2. 更新记录后运行 save_history。

      例子:

      old_status = @record.status
      if @record.update\_attributes(params[:record])
        save_history_here if old_status != @record.status
        flash[:notice] = "Successful!"
        ...
      else
        ...
      end
      

      【讨论】:

        【解决方案4】:

        有没有人听说过数据库触发器? 如果您在数据库服务器上编写 on_update 数据库触发器,那么每次更新记录时,它都会在关联的审计表中创建上一条记录值的历史副本。

        这是我鄙视 Rails 的主要方面之一。它花费大量时间试图为开发人员做所有事情,以至于让开发人员误以为他们必须遵循诸如编写专门的 Rails 方法之类的粗俗做法来完成该死的数据库服务器已经完全能够自己完成的所有事情。

        再次对 Rails 摇头

        【讨论】:

        • 如果你能告诉我如何让数据库触发器写入历史日志文件,我会支持你。
        • 为什么数据库触发器会写入日志文件?在这种情况下,触发器的唯一目的是作为触发器所针对的表上的历史活动日志。记录到文件是应用程序的责任。我开始认为根本缺乏基本的系统理解。但是,我们谈论的是 Rails。所以,我想这解释了“不知道为什么做所有事情”的心态。无意冒犯,乔治。但是,Rails 是对常识编程最好的歪曲。
        • 啊,对不起。我想我最初误读了您的评论,因为原始评论提到了历史文件。你是对的。在这种情况下,审计表和触发器要好得多。赞成。
        • 在不了解应用程序及其要求的情况下,您不能仅仅放弃技术和框架。作为一个完全假设的示例,假设需要在数据库中创建一些审计记录,并且需要通过 REST API 将一些审计记录发送到远程审计服务器,具体取决于行中的一些信息。在这种情况下,数据库触发器是完全不合适的。我可以想出许多情况,其中由数据库而不是代码生成的行是不合适的。唯一的“歪曲常识”是在没有支持数据的情况下做出笼统的陈述。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多