Rails ActiveRecord after_initialize和overriden访问器方法

时间:2013-01-16 16:32:06

标签: ruby-on-rails

这是我的代码示例:

class User < ActiveRecord::Base

  belongs_to :account

  after_initialize :setup_account

  def setup_account
    self.account = Account.new
  end

  def email=(email)
    self.account.email = email
    super(email)
  end

end

现在,以下调用失败:

User.new(email: 'hello@example.com')

因为这是在setup_account方法之前执行email =方法,所以会设置帐户变量。

您如何更改此代码以按预期工作?我知道复制电子邮件是件坏事,但它可能是别的而不是简单的副本。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容。它不使用任何回调,但懒惰地创建一个帐户或返回现有帐户。

class User < ActiveRecord::Base
  belongs_to :account, autosave: true

  # ...

  def user_account
    self.account ||= Account.new
  end

  def email=(email)
    user_account.email = email
    super
  end
end

您还需要指定在保存用户对象时要自动保存account关联。否则,您必须在更新用户记录时手动执行此操作。