2012-07-15 121 views
2

我的用戶模型中有validate :my_validate,但如果「has_may:through」屬性發生更改,則不會調用my_validate。這是正確的行爲?以「has_many:through」進行驗證

我的代碼:

class User < ActiveRecord::Base 

    has_many :roles, :through => :user_roles 

    validate :my_validate 
    def my_validate 
    raise 123 
    end 

這引發異常:

User.find(1).name = 'new_name' 

這工作:

User.find(1).roles = [] 

據我瞭解,用戶表沒有更新,以便軌道認爲驗證是沒有必要的,但它看起來很奇怪。

回答

0
User.find(1).name = 'new_name' 

它拋出異常,因爲要與一些價值分配名稱,並嘗試保存對用戶的價值表,在驗證方法「my_validate」你提出了一些錯誤,意味着如果你想它會拋出一個錯誤保存任何價值。

User.find(1).roles = [] 

但在第二個方法你是不是在 用戶表分配一定的參考價值的角色表。明智的是它不會拋出任何錯誤。

+0

「我知道用戶表沒有更新,所以導軌認爲驗證沒有必要,但它看起來很奇怪。」 – 2012-07-16 07:51:47

+0

我認爲驗證不是關於「表」,它應該是關於「模型」。 「角色」和「名字」都是屬性,儘管它們有內在的表現,它們應該同樣表現。 – 2012-07-16 07:59:51

+0

我的意思是,當你在用戶模型中使用保存方法時,它嘗試保存數據在你的表中,例如user = User.find(1).name ='new_name'和user.save,它會嘗試在用戶中存儲數據表。 – 2012-07-16 09:08:32