Ruby on rails 在\u之后,为已添加的\u添加回调

Ruby on rails 在\u之后,为已添加的\u添加回调,ruby-on-rails,activerecord,callback,associations,Ruby On Rails,Activerecord,Callback,Associations,这似乎是“有很多”和“有一个”之间的不一致 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 :

这似乎是“有很多”和“有一个”之间的不一致

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\u one实现相同的功能?

我认为您可以在保存前使用,并检查车辆关系是否已更改:

before_save :do_something

def do_something
  puts "Added car" if car_changed?
end

我给出的原始示例有点过于简化。我真正的问题包括对汽车模型的创建后回调。不幸的是,Car#after#create是在Person#before#save之后调用的,因此名称还不可用。您可以将其反转,然后-在您的汽车模型中创建的after#中,检查关联的Person记录是否是新的#?在那里进行处理。我希望避免这样做。我花了足够长的时间试图找到一个干净的方法来做这件事,但现在看起来没有。也许是时候对rails源代码进行破解并添加缺少的回调了。