何时使用“ validates_associated” v“ belongs_to:parent,:validate => true”

问题描述

| 似乎在rails中,您可以在两个地方(在关联本身上)定义关联验证:
class Child

  belongs_to :parent,:validate => true

end
或作为验证回调:
class Child

  belongs_to :parent

  validates_associated :parent

end
这两种方法有什么区别? 测试差异 我认为前者可能会产生背压并强制父代仅在子代有效时才有效: 即(当设置:validate => true时)
child.valid? # => false
child.parent.valid? # => also evaluates to false because of the :validate => true condition


# do whatever it takes to make the child valid again
#...
child.valid? # => true
child.parent.valid? # => true
但是,我对其进行了测试,但这并没有发生。那么这两种方法之间有什么区别(如果有)?     

解决方法

        我必须深入研究Rails(3.0.7)代码才能找到一些区别。在我看来,核心功能是相同的-它们似乎都在关联的记录上调用了“ 3”。 我确实发现的主要区别仅在使用“ 4”功能时出现,或者在销毁关联对象或将其标记为销毁时出现。例如,我有:
class AbsentDate < ActiveRecord::Base
  belongs_to :user,:autosave => true,:validate => true
end
而且我看到以下行为:
user = User.new(:username => \"Jimmy\")
user.valid?                               # => true
ad = AbsentDate.new(:user => user)
user.username = nil                          
user.valid?                               # => false
ad.valid?                                 # => false
ad.errors.full_messages                   # => [\"User username cannot be empty\"]
ad.user.mark_for_destruction
ad.valid?                                 # => true
请注意,将用户标记为销毁会导致有效的缺勤日期。另请注意,只有一条错误消息。现在考虑这种情况:
class AbsentDate < ActiveRecord::Base
  belongs_to :user,:autosave => true
  validates_associated :user
end
这是我看到的情况:
user = User.new(:username => \"Jimmy\")
user.valid?                                # => true
ad = AbsentDate.new(:user => user)
user.username = nil
user.valid?                                # => false
ad.valid?                                  # => false
ad.errors.full_messages                    # => [\"User username cannot be empty\",\"User is invalid\"]
ad.user.mark_for_destruction
ad.valid?                                  # => false
这次有两个错误消息,即使AbsentDate的用户已被标记为销毁,它仍然为false。我能够通过调用destroy而不是mark_for_destruction复制这些结果。 最后一件事:如果您使用
validates_associated
,那么您将获得几个选项(ѭ10flag,
:unless
:on
:message
),如果您使用
belongs_to
上的标记则不会有。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...