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。
我该怎么做?
我只想为这个用例定义一个特殊的方法:
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当您只想返回单个记录时应该返回不起作用的内容。