Validations 校验

和 Active Model 里的校验实现原理类似,但有一点不同:这里校验的属性要是关联对象或要从数据库'读'数据。

1) validates_associated(*attr_names)

校验是否存在关联(关系)。可以同时校验多个关联(关系)

class Book < ActiveRecord::Base
  has_many :pages
  belongs_to :library

  validates_associated :pages, :library
end

2) validates_presence_of(*attr_names)

校验(数据库里)是否存在着关联对象。

3) validates_uniqueness_of(*attr_names)

校验属性的值是否唯一。默认是对所有 record 进行校验,可以用 scope 或 conditions 指定约束条件。

class Person < ActiveRecord::Base
  validates_uniqueness_of :user_name
end

# 加 scope 约束条件
# 同一 account 的 person, user_name 不能相同
# 不同 account 的 person, user_name 可以相同
class Person < ActiveRecord::Base
  validates_uniqueness_of :user_name, scope: :account_id
end

# 加 conditions 约束条件
# status 为 archived 的 article,title 不能相同
# status 为其它值的 article,title 可以相同
class Article < ActiveRecord::Base
  validates_uniqueness_of :title, conditions: -> { where.not(status: 'archived') }
end

同名实例方法:

save
save!

valid? & validate

这里的 save 是对 Persistence(持久化)里的 save 方法做的一层包装,在"保存"之前用来做校验工作,并不是真正的保存操作。当传递 validate: false 时,可以跳过此校验。其它同名实例方法意义类似。

最后更新于