TypeLogistic
是Order
我在before_save
上有一个Order
回调。在before_save
回调中,我需要采取不同的操作,具体取决于Order
是否有特定的孩子TypeLogistic
。
代码:
class Order
before_save :do_something
def do_something
if self.type_logistics.where(type_of_logistics:"this type").present?
...
# something that uses the data in the child type_logistic
else
...
end
end
end
这有可能吗?只是玩控制台:
o = Order.new({"type_logistics_attributes" => [{"type_of_logistics" => "this_type}]})
o.type_logistics
=> #<ActiveRecord::Associations::CollectionProxy [#<TypeLogistic id: nil, type_of_logistics: "this type" >]>
o.type_logistics.where(type_of_logistics:"delivery")
=> #<ActiveRecord::AssociationRelation []>
我想,自从控制台的第二个声明返回了一些东西,那么也许有一种方法可以获得第三个控制台?
如果完全不可能,我会接受其他建议。其他一些背景:
我无法真正使用after_commit
,因为do_something
方法中的某些内容需要通过new_record?
检测attribute_changed?
或ActiveRecord::Dirty
,这不起作用after_commit
顺便提一下,after_save
应该可以使用,因为它允许我对attribute_changed?
进行上述检测,同时还可以使用对象ID,但是在生产中我发现了它不是。也许是因为do_something
包含在不同线程上运行且无法找到所需记录的延迟作业
这就是我试图让before_save
工作的原因。如果找不到子对象,我要做的就是解析所需子对象属性的参数。没什么大不了的,只是这不会那么容易。
答案 0 :(得分:0)
我的建议:不要使用回调,使用某种服务对象来处理保存该命令。 回调将变得混乱,难以调试,测试和维护。