2014-10-04 25 views
0

設置我的模型時,我經常發現自己在設置特定驗證時必須寫出所有屬性。一個常見的例子是,當我使用presence參數:在Rails中選擇模型的所有當前屬性進行驗證

validates :first_name, :last_name, :username, :email, presence: true

有一個聰明的方式來選擇其所有屬性沒有明確地寫他們全力以赴類似於如何在鐵軌控制檯找回它們?

User.columns

而且它通過如在只會驗證方法的參數?

ALL_ATTRIBUTES = User.columns 

validates ALL_ATTRIBUTES, presence: true 

嘗試這樣的事情了,我得到這個錯誤undefined method 'to_sym'

回答

2

我不會鼓勵你或任何人這樣做。原因是當你遇到問題時,當你的模型的對象沒有得到保存,並且由於在未來一段時間之後添加到應用程序的新列引發錯誤,並且你或者新開發者會想知道爲什麼?!?! 。

但是,如果你必須做你在這兒籤:

validates *self.column_names.map(&:to_sym), presence: true 

這裏,*在Ruby中被稱爲splat operatorhere's the explanation on &:

+0

感謝您的警告,並且這似乎是做招。只是幾個問題。在將屬性轉換爲符號之前,爲什麼在自我和'&:之前的'*'? – 2014-10-04 14:24:39

+0

@CarlEdwards'column_names.map(&:to_sym)'是'column_names.map {| column | column.to_sym}'。如果你只是調用屬性的方法,那麼你可以縮短使用'&:to_sym'。這是句法糖。 – Mohamad 2014-10-04 14:28:36

+0

@CarlEdwards:增加了對你疑惑的解釋。如果答案有幫助,那麼請接受它,以便其他人可以使用它作爲參考。謝謝。 – Surya 2014-10-04 14:29:05

1

這是一個可怕的想法。但你可以這樣做:

attrs = column_names.map { |column| column.to_sym } 
validates *attrs, presence: true 

爲什麼這是一個壞主意?因爲它不太清楚正在驗證的內容。它使調試變得困難,並可能導致你有奇怪的錯誤。如果您將來添加的列不需要進行在線驗證,那麼您會絆倒。此外,有些事情我不需要存在。例如,電子郵件字段將需要正則表達式驗證,該驗證會自動知道空白字符串是無效的。所以存在驗證器是多餘的。

當心因爲太聰明,因爲它有時候並不那麼聰明。

+0

我最終得到這個:未定義的方法to_sym'[:id,:name,:position,:visible,:created_at,:updated_at]:Array' – 2014-10-04 14:17:13

相關問題