如何在我覆盖的Rails属性上运行验证?

时间:2017-02-12 20:33:44

标签: ruby-on-rails validation activerecord

我有一个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

但是,这至少导致两个问题:

  1. I can't search for a user by email without an explicit call to to_s.

  2. 我无法再在email列上运行唯一性验证。我得到TypeError: can't cast Email to string。 (我可以使用自定义验证器解决此问题。)

  3. 问题:

    1. 这种方法有问题吗?它破坏了我的验证这一事实对我来说是一种代码味道。
    2. 有没有办法让现有的validates :email, uniqueness: { case_sensitive: false }验证能够使用这些新的访问者定义?

0 个答案:

没有答案