为什么存在`validates_associated`?

时间:2015-03-02 06:37:33

标签: ruby-on-rails

railsguide的

This section说:

  

当模型与其他模型关联时,您应该使用此帮助程序,并且还需要验证它们。

所以我认为相关模型的验证不会在没有validates_associated的情况下运行。

但实际上,它是在没有它的情况下运行的。

有两种模式,学校和学生。

class School < ActiveRecord::Base
  has_many :students
  validates :name,  presence: true
end

class Student < ActiveRecord::Base
  belongs_to :school
  validates :name,  presence: true
end

在rails控制台上,

school = School.new
=> #<School id: nil, name: nil, created_at: nil, updated_at: nil>

school.students << Student.new
=> #<ActiveRecord::Associations::CollectionProxy [#<Student id: nil, name: nil, school_id: nil, created_at: nil, updated_at: nil>]>

school.name = "test shcool"
=> "test shcool"

school.save
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
=> false

school.errors.full_messages
=> ["Students is invalid"]

如果使用如下的validates_associated:

class School < ActiveRecord::Base
  has_many :students
  validates :name,  presence: true
  validates_associated :students
end

class Student < ActiveRecord::Base
  belongs_to :school
  validates :name,  presence: true
end

在rails控制台上,我运行了与上面完全相同的命令。但是最后一个命令school.errors.full_messages返回了不同的结果。 (奇怪的是有重复的错误消息。)

school.errors.full_messages
=> ["Students is invalid", "Students is invalid"]

我的问题是

  1. 这是RailsGuide的错误吗?

  2. 为什么validates_associated存在?

  3. 或者我有任何错误的想法?

    我的环境是

    ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0]
    Rails 4.2.0
    

1 个答案:

答案 0 :(得分:0)

在保存

之前检查相关对象是否有效