执行 find_by(email: ...) 时标准化电子邮件

Dor*_*ian 0 ruby ruby-on-rails

我将 a 中的电子邮件地址标准化before_validation,例如:

class User
  before_validation do
    self.email = normalized_email
  end

  def normalized_email
    User.normalize_email(email)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,例如,我必须User.find_by(email: User.normalize_email(params[:email]))在任何地方执行此操作,今天在尝试查找用户时,我忘记了对电子邮件地址进行标准化,因此我希望自动完成此操作。

理想情况下,我不会覆盖find_by,它适用于所有方法,例如where

我该怎么做?

spi*_*ann 6

我只想为这个用例定义一个特殊的方法:

class User
  def self.by_email(email)
    find_by(email: User.normalize_email(email))
  end

  before_validation do
    self.email = normalized_email
  end

  def normalized_email
    User.normalize_email(email)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后可以这样使用:

User.by_email(params[:email])
Run Code Online (Sandbox Code Playgroud)

请注意,我明确不建议scope为此使用 a ,因为按照约定范围应该是可链接的,因此ActiveRecord::Relations当您只想返回单个记录时应该返回不起作用的内容。