可以为所有finder方法规范化属性吗?

时间:2018-02-23 04:34:10

标签: ruby-on-rails

假设我有一个Rails 5模型,其中包含需要规范化的属性,如网址或电子邮件。

class Person < ApplicationRecord
  # Using the attribute_normalizer gem
  normalize_attributes :email, with :email

  ...
end

我希望如此,当在该模型上使用finder方法时,该搜索属性也会被标准化。例如......

# This would match 'foo@example.com'
person = Person.find_by( email: 'FOO@EXAMPLE.COM' )

# This would also match 'foo@example.com'
person = Person.find_by( email: 'foo+extra@example.com' )

我尝试提供自己的Person.find_by,认为其他查找器方法最终会调用它。

def self.find_by(*args)
  attrs = args.first
  normalize_email_attribute(attrs) if attrs.kind_of?(Hash) 
  super
end

适用于Person.find_by,但尽管内部Rails使用find_by用于find_or_create_by等其他查找程序方法,但它们不会调用Person.find_by。我必须覆盖个人查找器方法。

def self.find_or_create_by(attrs, &block)
  normalize_email_attribute(attrs)
  super
end

def self.find_or_create_by!(attrs, &block)
  normalize_email_attribute(attrs)
  super
end

是否有办法针对所有finder方法规范化特定模型的搜索属性?或者更好地完成同样的事情?

0 个答案:

没有答案