验证
Mongoid 包括提供基本验证的 ActiveModel::Validations
以及附加的关联和唯一性验证器。
请参阅 Active Record 验证 Rails指南和 ActiveModel::Validations 文档以获取更多信息。
在已持久化的数据上使用#valid?
时,Mongoid 的行为与 Active Record 略有不同。 作为优化,Active Record 的#valid?
将运行所有验证,而 Mongoid 的#valid?
将仅对内存中的文档运行验证。
validates_uniqueness_of
和:conditions
选项
validates_uniqueness_of
的:conditions
选项可用于提供附加条件,添加到查找相同文档的数据库查询中。 此选项不会影响何时执行验证,因为 Mongoid 从模型中检索相应字段的当前值时不会考虑此选项。 考虑以下示例:
class Band include Mongoid::Document field :name, type: String field :year, type: Integer validates_uniqueness_of :name, conditions: -> { where(:year.gte => 2000) } end # OK Band.create!(name: "Sun Project", year: 2000) # Fails validation because there is a band with the "Sun Project" name # and year 2000 in the database, even though the model being created now # does not have a year. Band.create!(name: "Sun Project")
读取偏好 validates_uniqueness_of
为了验证属性的唯一性,Mongoid 必须检查数据库中是否存在该属性的值。 如果从节点(secondary node from replica set)查询副本集的从节点,则它可能正在读取过时的数据。 因此,用于检查validates_uniqueness_of
验证的查询始终使用读取偏好(read preference)primary
。