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是否发生了变化。它可能有,对于我的用例,我认为您的解决方案应该是好的。谢谢