假设我有一个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方法规范化特定模型的搜索属性?或者更好地完成同样的事情?