【问题标题】:Activerecord - callback after all associated objects are savedActiverecord - 保存所有关联对象后的回调
【发布时间】:2009-03-26 07:14:28
【问题描述】:

我有一个模型,出于性能原因,我想存储关联对象的 ID(非规范化)。我有一个看起来像这样的方法:

def cache_ids
  self._tag_ids = self.tag_ids
end

我以为我可以在 before_save 上运行它,但是有一个问题 - 一些关联的对象可能是新记录,因此它们不会有 id。

然后我切换到after_save,但是显然这个回调也是在事务提交之前触发的,所以ids仍然没有设置。

当时我的结局是:

def save_with_idcache(*args)
  return false unless save_without_idcache(*args)

  cache_ids

  return save_without_idcache(false)
end

alias_method_chain :save, :idcache

这似乎可行,但看起来不是很优雅。

有没有更好的方法?比如,对象和关联对象都保存后的回调?

也许我遗漏了一些明显的东西。

【问题讨论】:

  • 不是 100% 确定您要做什么,但我觉得有点味道。获取关联元素的 id 可以通过单个查询完成 ... ?
  • 我同意 Toby 的观点,您可以在单个查询中拉回关联的对象或 ID。缓存它们的驱动程序是什么?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您可以反过来尝试 - 让关联对象在 after_createafter_save(如果它们从关联中删除和/或添加到新关联)和 after_destroy 中更新其父级的 _tag_ids

这是否是一个更好的解决方案将取决于它们的数量、移动它们的程度以及对脏属性的处理程度。

【讨论】:

    【解决方案2】:

    你也可以使用 after_create 吗? id 会在那里。

    after_create :idcache
    before_save :idcache
    
    protected
    def idcache
      unless new_record?
        ...
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多