每当创建一个User
对象时,我也希望创建一个UserInfo
对象,并将其链接到该对象。
不幸的是,这不会创建任何UserInfo
:
class User < ActiveRecord::Base
has_one :user_info
...
def init
self.user_info = user_info
self.save!
end
为什么不调用init
方法?如何实现我的目标?
答案 0 :(得分:1)
create_user_info
已经是User
个实例的方法,所以你想要的就是:
class User < ActiveRecord::Base
has_one :user_info
before_create :create_user_info
end
编辑: init
在Rails下没有做任何特别神奇的事情(我......也不认为它在基本的Ruby下也是如此 - 你是否想到{{1}我会假设你是)。在内存中创建Ruby类的实例时会触发initialize
。这与数据库中创建的模型实例相差甚远;一个新的类实例可能是由于您调用initialize
(而不是保存),或者甚至是因为从数据库中读取实例。
如果要介入数据库操作,则需要使用ActiveRecord回调。您可能会发现my answer to this question很有用。
答案 1 :(得分:1)
before_save 回调触发器。 我建议使用after_create因为before_create可以返回错误
class User < ActiveRecord::Base
has_one :user_info
...
after_create do
create_user_info
end
答案 2 :(得分:0)
在您的用户模型中,使用before_save过滤器而不是init,如下所示:
before_save :create_user_info
...
private
def create_user_info
user_info = UserInfo.new
if user_info.save
self.user_info_id = user_info.id
end
end