【问题标题】:Rails :dependent => destroy, want to call another action instead of destroyRails :dependent => destroy,想要调用另一个动作而不是销毁
【发布时间】:2012-02-17 10:37:32
【问题描述】:

我有一个完美运行的 has_many :through 模型。

  has_many :varietals
  has_many :grapes, :through => :varietals, :dependent => :destroy

我想调用另一个动作而不是 :destroy。事实上,我并不想使该项目无效或销毁它,我想将记录状态字段从 1 更新为 0,而不是销毁记录。

如何调用自定义方法而不是 destroy ?我想我可以在模型本身中做到这一点......谢谢。

把这个方法放在哪里?在主模型中还是在记录将被销毁的模型中?

编辑

对不起,我认为我没有充分解释我的问题。我的问题不仅是主模型被破坏后的事情。即使没有销毁主记录,我也想在 Varietal 模型本身中自定义销毁操作。

类似:

class Varietal < ActiveRecord::Base

    private
      def destroy
        self.update_attributes(:status => 0)
      end
end

其实这个动作并没有被调用...

【问题讨论】:

    标签: ruby-on-rails destroy


    【解决方案1】:

    您可以使用 before_destroy 将您的自定义逻辑放在那里。例如,

    before_destroy :reset_status
    
    def reset_status
      ...
    end
    

    查看here了解更多详情。

    【讨论】:

      【解决方案2】:

      您只需要在 before_destroy 或 after_destroy 上添加一个回调并操作您的关联。举例

      after_destroy :do_on_grapes
      
      def do_on_grapes
        grapes.map(&:to_do)
      end
      

      【讨论】:

        【解决方案3】:

        has_many :dependent 仅限于几个选项。根据documentation

        :dependent 如果设置为 :destroy 所有关联的对象都被销毁 通过调用他们的destroy方法在这个对象旁边。如果设置为 :delete_all 所有关联的对象都被删除而不调用它们 销毁方法。如果设置为 :nullify 所有关联对象的外部 键设置为 NULL 而不调用它们的保存回调。如果设置为 :restrict 此对象引发 ActiveRecord::DeleteRestrictionError 异常,如果有关联对象则不能删除。

        如果与 :through 选项一起使用,则连接模型上的关联 必须是belongs_to,被删除的记录是join 记录,而不是关联的记录。

        看来您需要更改 destroy 方法来更新状态字段。

        【讨论】:

        • 我更新了我的第一条消息并解释了更多...如何更改销毁方法?
        • 没关系,如果您看到我之前的评论(已删除)... Phyo 和 Shingara 有正确的看法。
        • 很抱歉,问题不在于我的模型中的关联。如果我只有一个模型,我不能覆盖 destroy 方法来改变它的行为。这无济于事。添加 before 或 after 回调不会改变销毁:该项目将被销毁。
        【解决方案4】:

        我相信解决您的问题的好方法是提供自定义销毁方法。此类问题有多种回答,但您应记住 ActiveRecord 和关系如下:

        class Image < ActiveRecord::Base
          has_many :comments, dependent: :destroy
        

        也使用触发破坏链接到您的关系的回调机制。通常您应该保留此机制并将其添加到您的自定义实现中。例如

          def destroy
            self.update deleted_at: Time.now
            run_callbacks :destroy
          end
        

        您也可以阅读这篇文章: Triggering dependent: :destroy with overridden destroy-method

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 1970-01-01
          • 1970-01-01
          • 2016-10-23
          • 1970-01-01
          • 2011-08-28
          相关资源
          最近更新 更多