Rails - 跳过子类的rails验证

ale*_*lex 18 validation ruby-on-rails

我有一个User类,以及Contact是User的子类的Contact.这两个类都存储在users表中.

我的联系人可能有也可能没有电子邮件地址,而我的用户需要一个电子邮件地址(validates_presence_of :email我的用户模型定义中有).

我的理由是,用户输入联系人,以后可能会在用户声明其个人资料时成为用户.

  • 首先,我可以按照我的方式定义用户和联系人吗?
  • 其次,如何跳过validate_presence_of email 联系人模型中的 验证?

(我在轨道2.3.8)

谢谢!

更新:

  • 似乎单表继承旨在完全满足我的需要

  • 跳过我的Contact表的电子邮件验证的正确方法如下:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

Chu*_*ebs 22

听起来你应该将User和Contacts抽象为两个表,而不是试图将它们合并为一个.虽然联系人可以成为用户,但这并不意味着他们会(我认为?).

这也可以解决您的validate_presence_of :email问题,因为联系人表/模型甚至没有该字段.我相信,这也可以减轻以后潜在的性能问题.您不希望有大量的联系人来排序以查找注册用户.

如果你已经死在一张桌子上,我相信你可以做如下的事情:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

这假设您有一个user_type列,但您可以替换它,具体取决于您如何确定a是否User为a Contact.

更新:

这是您正确验证模型的方法:validates_presence_of从模型中删除并将其放在此块内:

with_options :unless => :user_type == "contact" do |user|
   user.validates_presence_of :email
end
Run Code Online (Sandbox Code Playgroud)