ActiveRecord:如果我覆盖getter方法,如何获取记录列值?

big*_*ato 3 activerecord ruby-on-rails

我有一个Users包含3个字段的表:guest_email(string), email(string), and guest(boolean)

我想覆盖电子邮件的获取方法,这样如果用户是访客,它会抓取guest_email而不是电子邮件.

我该怎么做?这会导致堆栈溢出,因为它会调用自身:

def email
  self.guest? ? self.guest_email : email
end
Run Code Online (Sandbox Code Playgroud)

在方法内部,我如何获取该特定记录的电子邮件列的值并绕过getter方法?

vee*_*vee 8

用途read_attribute:

def email
  guest? ? guest_email : read_attribute(:email)
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以self[:attribute]按照@Stefan的指示使用:

def email
  guest? ? guest_email : self[:email]
end
Run Code Online (Sandbox Code Playgroud)

  • `self [:email]`也应该有用 - 它是`read_attribute`的别名 (4认同)