Ruby on rails 初始化时生成关联以满足委托

Ruby on rails 初始化时生成关联以满足委托,ruby-on-rails,activerecord,delegates,associations,activeadmin,Ruby On Rails,Activerecord,Delegates,Associations,Activeadmin,我有一个最小的示例模型: class Book < ActiveRecord::Base belongs_to :author delegate :name, prefix: true, to: author after_initialize { author ||= Author.new } end classbook

我有一个最小的示例模型:

class Book < ActiveRecord::Base
  belongs_to :author
  delegate :name, prefix: true, to: author

  after_initialize { author ||= Author.new } 
end
classbook
发布表单数据后,我的框架(是的,ActiveAdmin)执行以下操作:
Book.new{author\u name:'Some Dude'}
,这导致
author\u name
未被写入,因为
After\u initialize
回调仅在
Book
初始化后调用


如何在“初始化之前”或“初始化时”建立关联?有好的图案吗

您可以重写initialize方法并调用super:

class Book < ActiveRecord::Base
  belongs_to :author
  delegate :name, prefix: true, to: author

  def initialize(*args)
     author ||= Author.new
     super 
  end 
end
classbook
听起来不错,这可能是唯一可行的解决方案。但在谷歌搜索时,我发现重写
initialize
是不可取的,因为ActiveRecord有时不会以标准方式初始化对象。你没有重写它,正如你所说的super。这意味着你正在做一些事情,然后说,去做你想做的事情吧是的,但是在某些情况下,
initialize
可能不会被调用,这是我读到的。从技术上讲,你可以覆盖new,而不是initialize,这会做同样的事情。不过,请小心,并测试您的代码……我指的是这篇文章:--从那以后,我没有检查AR是否发生了变化。它可能有,对于我的用例,我认为您的解决方案应该是好的。谢谢