2012-07-15 123 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