2011-04-24 47 views
18

我有一個User類和Contact where Contact是User的子類。這兩個類都存儲在用戶表中。Rails - Skip rails驗證的子類

我的聯繫人可能有也可能沒有電子郵件地址,而我的用戶需要電子郵件地址(我的用戶模型定義中有validates_presence_of :email)。

我的推理是,聯繫人是由用戶輸入的,並且可能以後會在用戶聲明其個人資料時成爲用戶。

  • 首先,可以按我的方式定義我的 用戶和聯繫人嗎?
  • 二,如何在我的聯繫人模式中跳過 validate_presence_of email 驗證?

(我在軌2.3.8)

謝謝!

UPDATE:

  • 看來單表繼承被 設計做的正是我需要

  • 跳過驗證了 電子郵件的存在爲我聯繫的正確途徑 表如下:

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

+1

不宜用戶是子類聯繫人?在我看來,用戶*是註冊的聯繫人。但聯繫人不一定是用戶。這也可以解決你的驗證問題,因爲驗證將在用戶模型中進行,否定了對:except子句的需要。 – Raphael 2012-01-24 23:34:56

回答

22

聽起來你應該將用戶和聯繫人抽象爲兩個表格,而不是將它們合併成一個表格。雖然聯繫人可以成爲用戶,但這並不意味着他們會(我認爲?)。

這也解決了您的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 
+0

我目前在我的用戶表中有一個「user_type」字段,表示該行是用戶還是聯繫人。將兩者都放在同一張表格中可以讓我更容易在聯繫人聲明其個人資料時將聯繫人轉換爲用戶。而且所有的字段都是相似的,只有電子郵件的驗證是不同的。這就是爲什麼我想使用相同的表格。 任何線索我可以繞過驗證的電子郵件字段(或者,我可以做Contact.save(false),但它跳過所有驗證,而不僅僅是電子郵件。 – alex 2011-04-24 21:37:18

+0

我明白,它不一定是一種壞方法根據我的理解,用戶可能有數百個聯繫人,而這些聯繫人不一定是註冊用戶,如果您的站點增加到10萬個用戶,請考慮將其合併到一個表中的性能影響,儘管目前這不是問題,如果這種情況發生,那麼現在只需要進行設計更改就更麻煩了,因爲本質上是交易更多的數據庫調用,因爲沒有可能的巨大表格 – 2011-04-24 21:41:57

+0

另外,看看我更新後的答案:'validates_presence_of :電子郵件,除非...'位應該工作,如果內存正確地服務我。 – 2011-04-24 21:42:37