Activerecord - 保存所有关联对象后的回调

时间:2009-03-26 07:14:29

标签: ruby-on-rails ruby activerecord

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

def cache_ids
  self._tag_ids = self.tag_ids
end

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

然后我切换到after_save,但显然在提交事务之前也会触发此回调,因此仍然没有设置ID。

目前我最终得到了:

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

这似乎有效,但看起来并不优雅。

还有更好的方法吗?比如,对象和相关对象之后的回调都被保存了吗?

也许我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:1)

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

这是否是一个更好的解决方案将取决于它们中有多少,你有多少移动它们,以及你想对脏属性的谨慎程度。

答案 1 :(得分:0)

你也可以使用after_create吗?身份证将在那里。

after_create :idcache
before_save :idcache

protected
def idcache
  unless new_record?
    ...
  end
end