我有一个User
模型,其email
属性。我的应用程序的各个部分都以不同的方式构思了“电子邮件”;有时作为字符串,有时作为散列({ token: 'foo', host: 'bar.com' }
),有时作为对象。这是不好的;无论我在哪里使用它,我都希望电子邮件的概念保持一致。
所以,我使用一个Email
对象做我想要的。我认为没有任何理由创建Email
表;相反,我只想在需要时创建一个与电子邮件字符串对应的新Email
对象。因此User
看起来像这样:
class User < ActiveRecord::Base
def email
Email.new(read_attribute :email)
end
def email= email
write_attribute :email, email.to_s
end
end
但是,这至少导致两个问题:
I can't search for a user by email without an explicit call to to_s
.
我无法再在email
列上运行唯一性验证。我得到TypeError: can't cast Email to string
。 (我可以使用自定义验证器解决此问题。)
问题:
validates :email, uniqueness: { case_sensitive: false }
验证能够使用这些新的访问者定义?