每当创建User对象时,也创建UserInfo对象

时间:2011-07-19 07:46:57

标签: ruby-on-rails-3

每当创建一个User对象时,我也希望创建一个UserInfo对象,并将其链接到该对象。

不幸的是,这不会创建任何UserInfo

class User < ActiveRecord::Base
  has_one :user_info
  ...

  def init
    self.user_info = user_info
    self.save!
  end

为什么不调用init方法?如何实现我的目标?

3 个答案:

答案 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