Rails模型:如何在保存之前计数(带过滤器)嵌套实体



我有一个父实体,它包含通过嵌套属性同时创建的子实体。在父实体上,我有一个保存前回调,它根据嵌套项计算要存储的一些数据。问题是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 }

相关内容

  • 没有找到相关文章