【问题标题】:Rails - Skip rails validation for subclassRails - 跳过子类的 rails 验证
【发布时间】:2011-04-24 21:28:31
【问题描述】:

我有一个用户类和一个联系人,其中联系人是用户的子类。这两个类都存储在用户表中。

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

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

  • 首先,可以定义我的 用户和联系人是我做的吗?
  • 二、如何跳过 validate_presence_of email 在我的联系人模型中进行验证?

(我在 Rails 2.3.8 上)

谢谢!

更新:

  • 似乎单表继承是 专为满足我的需要而设计

  • 跳过验证的正确方法 我的联系人的电子邮件的存在 表格如下:

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

【问题讨论】:

  • 用户不应该是联系人的子类吗?在我看来,用户 已注册的联系人。但联系人不一定是用户。这也将解决您的验证问题,因为验证将在 User 模型中进行,从而不需要 :unless 子句。

标签: ruby-on-rails validation


【解决方案1】:

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

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

如果你一心只想在一张桌子上做,我相信你可以做以下事情:

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

这是假设您有一个 user_type 列,但您可以根据您如何确定 User 是否为 Contact 来替换它。

更新

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

with_options :unless => :user_type == "contact" do |user|
   user.validates_presence_of :email
end

【讨论】:

  • 我的用户表中目前有一个“user_type”字段,用于说明该行是针对用户还是联系人。将两者放在同一个表中使我更容易在联系人声明其个人资料时将其转换为用户。并且所有字段都相似,只是电子邮件的验证不同。这就是为什么我想使用同一张桌子。任何关于如何绕过电子邮件字段验证的线索(或者,我可以执行 Contact.save(false),但它会跳过所有验证,而不仅仅是电子邮件。
  • 我明白这一点,这不一定是一种糟糕的做事方式。据我了解,用户可能有数百个不一定是注册用户的联系人。如果您的站点增长到 100,000 个用户,请考虑将其合并到一个表中的性能影响。尽管目前这不是问题,但如果发生这种情况,那么切换它会更麻烦,然后现在就进行设计更改。您实际上是在交易更多的数据库调用以换取没有潜在的巨大表。
  • 另外,看看我更新的答案。 validates_presence_of :email unless... 位应该可以工作,如果我没记错的话。
  • 感谢您为我指明正确的方向。我无法让它与with_options 一起工作,但它与unless 一起工作得很好(确切的语法是:validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}。另外,我将user_type 重命名为type,所以我可以使用单表继承我相信它的设计正是为了做我想做的事……我现在一直这样……也许以后会添加一个联系人表……现在没有时间进行更改。
  • 没问题的人。我没有尝试过with_options,这只是我在互联网上找到的似乎相关的东西。我很高兴你让它工作,我会更新答案以反映你的修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多