【问题标题】:Check if nested attributes changed after save检查保存后嵌套属性是否更改
【发布时间】:2014-02-17 21:07:42
【问题描述】:

我已经为此苦苦挣扎了一段时间。检查您是否添加、删除或更改了某些子对象的最佳方法是什么。

例如:

class Task < ActiveRecord::Base

  after_save :setup_task

  # =============== ASSOCIATIONS ===============
  has_many :lists, :through => :map_list_tasks

  def setup_task
    if list_attributes_changed?
      do something
    end
  end
end

我不知道该怎么做。我知道如何检查本地对象的属性是否更改。我怎样才能对孩子们这样做?

谢谢

编辑

在子节点上使用回调的问题在于我正在运行的方法,提取数百万条记录,进行一些数学计算和比较,然后保存数百万条新记录。如果我要在保存列表时触发此操作,它将运行 4 次而不是 1 次(或者将许多列表添加到任务中)。由于运行大约需要 25 分钟,因此这并不理想。这将需要一个多小时,并且会给盒子带来不必要的负载。另一个问题是该方法确实应该从“任务”运行,因为为添加的每个列表选择的选项决定了列表上将发生什么。例如,您可以添加 4 个列表,并将每个列表配置为 25%。在这种情况下,它将平均分配所有 4 个资源。因此,如果我要从列表中运行它,我仍然需要获取任务,然后是该任务的所有子任务,然后比较保存的选项并运行该方法

【问题讨论】:

  • 子对象是什么意思?请解释一下。
  • 任务有很多列表。我的任务表单有列表的嵌套表单。当我在任务表单上添加、删除或编辑这些列表时,我想运行 setup_task。如果任务本身的属性发生了变化(但不是列表属性),那么我不想运行 setup_task
  • 在这种情况下,您应该在 List 模型类中有 def setup_task 回调。保存列表对象后更新相关任务,否则不更新。

标签: ruby-on-rails ruby callback


【解决方案1】:

正如 Surya 所说,使用 list 模型会更好


列表模型

您必须记住,nested objects 只是在父模型中处理其他模型数据的一种方式。实际数据由各自的模型处理(在您的情况下为list

我会这样做:

#app/models/list.rb
Class List < ActiveRecord::Base
    after_save :setup_task

    def setup_task
        do something 
    end
end

我不完全确定您的代码上下文,但我猜您不需要检查关联的集合是否已更新,因为after_save 会提示某些内容已保存?

如果你让我知道你想用setup_task 实现什么,我就能为你的方法创建一些代码!

【讨论】:

  • 我明白,通常我会这样做,但我这里有一些特殊情况。我放了一个更新的解释。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2013-03-31
  • 2013-06-14
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多