在Ruby中BEFORE_SAVE回调中的子对象的ActiveRecord查询

时间:2016-09-18 21:43:24

标签: ruby-on-rails ruby activerecord callback

TypeLogisticOrder

的孩子

我在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 []>

我想,自从控制台的第二个声明返回了一些东西,那么也许有一种方法可以获得第三个控制台?

如果完全不可能,我会接受其他建议。其他一些背景:

  1. 我无法真正使用after_commit,因为do_something方法中的某些内容需要通过new_record?检测attribute_changed?ActiveRecord::Dirty,这不起作用after_commit

  2. 顺便提一下,after_save应该可以使用,因为它允许我对attribute_changed?进行上述检测,同时还可以使用对象ID,但是在生产中我发现了它不是。也许是因为do_something包含在不同线程上运行且无法找到所需记录的延迟作业

  3. 这就是我试图让before_save工作的原因。如果找不到子对象,我要做的就是解析所需子对象属性的参数。没什么大不了的,只是这不会那么容易。

1 个答案:

答案 0 :(得分:0)

我的建议:不要使用回调,使用某种服务对象来处理保存该命令。 回调将变得混乱,难以调试,测试和维护。