2009-08-26 58 views
14

我有一個Category和Post模型,每個Post都屬於一個Category。在創建或更新帖子之前,我需要檢查選擇的類別是否存在。驗證這些信息的最佳方式是什麼?Rails:驗證是否存在關聯

目前,我正在控制器中查找以確保類別存在。這種驗證可以在模型中進行嗎?

回答

14

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_presence_of :category 
end 

- 或 -

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates :category, presence: => true 
end 

的Rails之前的版本3.2:

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_existence_of :category 
end 
+0

這個工作,如果類別範圍?假設該類別屬於博客。應該只允許用戶選擇屬於博客的類別。 – Homar 2009-08-26 04:05:00

+0

@Homar如果belongs_to協會包含此限制,則不確定有關範圍限定,但我認爲它可行。 – 2009-08-26 16:10:23

+0

在更新的rails版本中,它被重命名爲validates_presence_of – Fa11enAngel 2013-09-03 20:21:39

5

我已經把這個在我的模型:

validate :ensure_category_exists 

    def ensure_category_exists 
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id) 
    end 

如果該類別不存在父級博客,則會打印「類別無效」。

-1

In Rails 3,validates_associated可能是你要找的東西? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

+2

'validates_associated'將在關聯模型上運行驗證,如果關聯無效,則主模型失敗。所以它會驗證存在性,但是它有可能或不需要的其他行爲。 – Woahdae 2011-12-17 03:59:23

+3

我測試過這個,如果關聯的模型不存在,那麼'validates_associated'不會中斷(就像你期望的那樣)。我猜如果只有相關模型確實存在,纔會失敗,並且至少有一個失敗。 – hsribei 2012-02-01 18:16:51

+0

正如obvio171所說,validates_associated不會驗證關聯的存在。 – hrdwdmrbl 2012-05-15 15:14:01

20

在Rails 3.2中,validates_existence_of替換爲validates_presence_of。

+4

也可能是'validates:category,:presence => true' – 2012-12-06 03:05:51

1

在我的思想是更好的選擇的方式是這種寶石:https://github.com/perfectline/validates_existence

它驗證了相關模型存在於數據庫中。假設你有一個下拉字段,即使你沒有選擇任何東西(默認的非選中的第一個字段標籤作爲值),也會返回一些垃圾數據。驗證存在將不起作用,因爲它將通過現有數據。但是我們想要某種約束,這個數據庫邊檢查就是解決問題的方法。