我有一个父实体,它包含通过嵌套属性同时创建的子实体。在父实体上,我有一个保存前回调,它根据嵌套项计算要存储的一些数据。问题是count
触发了对数据库的请求,但实体还不存在,所以它返回0。如果只是计数,我会使用size
属性,但我需要过滤我在回调中计算的内容本身。。。什么是最好的解决方案?请参阅下面的示例。
PS:我知道counter_cache
的计数,但由于我只通过父项创建子项,我更喜欢在计算其他属性的同时只计算一次。
class Parent < ApplicationRecord
has_many :children
accepts_nested_attributes_for :children
before_save :update_total
private
def update_total
self.total = children.size # OK, this works
self.total_success = children.count(&:result) # Always 0 since it queries the DB
end
end
class Child < ApplicationRecord
belongs_to :parent
before_save :update_result
private
def update_result
self.result = check_result
end
end
目前,我发现了一些有效的方法:在父回调之前调用子before save
回调。我觉得这不太好,但至少可以理解。
我以这种方式更新total_result
:
self.total_success = 0
children.each { |child| self.total_success += 1 if child.result }