我有一个模型,我想出于性能原因存储关联对象的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
这似乎有效,但看起来并不优雅。
还有更好的方法吗?比如,对象和相关对象之后的回调都被保存了吗?
也许我错过了一些明显的东西。
答案 0 :(得分:1)
您可以反过来尝试 - 让关联的对象在_tag_ids
,after_create
中更新其父级after_save
(如果它们已从关联中删除和/或添加到新关联中)和after_destroy
。
这是否是一个更好的解决方案将取决于它们中有多少,你有多少移动它们,以及你想对脏属性的谨慎程度。
答案 1 :(得分:0)
你也可以使用after_create吗?身份证将在那里。
after_create :idcache
before_save :idcache
protected
def idcache
unless new_record?
...
end
end