【问题标题】:after_add callback for has_onehas_one 的 after_add 回调
【发布时间】:2023-03-17 10:41:01
【问题描述】:

这似乎是 has_many 和 has_one 之间的不一致。

has_many 关联允许您指定在将对象添加到集合后调用的 after_add 回调。

class Person
  has_many :parents, :after_add => { puts "Added new parent" } # allowed
  has_one :car, :after_add => { puts "Added car" } # not allowed
end

class Car
  after_create :assign_name
  def assign_name
    self.name = "Herbie"
  end
end

不幸的是,has_one 关联没有 after_add 回调。你如何为 has_one 实现同样的目标?

【问题讨论】:

    标签: ruby-on-rails activerecord callback associations


    【解决方案1】:

    我认为你可以使用 before_save,并检查 car 关系是否发生了变化:

    before_save :do_something
    
    def do_something
      puts "Added car" if car_changed?
    end
    

    【讨论】:

    • 我给出的原始示例有点过于简化了。我真正的问题包括 Car 模型上的 after_create 回调。不幸的是,Car#after_create 是在 Person#before_save 之后调用的,因此该名称尚不可用。
    • 您可以逆转这一点,然后 - 在您的 Car 模型中的 after_create 中,检查关联的人员记录是否为 new_record?并在那里进行处理。
    • 我希望避免这样做。我花了足够长的时间试图找到一种干净的方法来做到这一点,目前看起来还没有。也许是时候破解 rails 源代码并添加缺失的回调了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多