校验
在 Web 应用中对写入数据库的数据的合法性校验是非常重要的,并且非常繁琐,这个过程一般需要各种不同的条件判断语句,可能还会包含大量的重复性代码,Rails 的 ActiveRecord 在设计的时候特别考虑到了数据校验这个过程,提供了非常多的辅助方法以简化数据校验的相关操作。
ActiveRecord 中自定义校验代码非常简单,可以使用 validates 来定义校验代码,在新建或者更新时都会被调用.
创建一个 Person Model,修改迁移文件,执行迁移操作映射到数据库
rails g model person
迁移脚本中增加一个 name 字段
class CreatePeople < ActiveRecord::Migration[7.0]
def change
create_table :people do |t|
t.string :name
t.timestamps
end
end
end
执行 rails db:migrate 映射到数据库
添加校验代码
class Person < ApplicationRecord
validates :name, presence: true
end
在以下方法执行时会进行校验
createcreate!savesave!updateupdate!
以下方法执行时不会校验
decrement!decrement_counterincrement!increment_counterinsertinsert!insert_allinsert_all!toggle!touchtouch_allupdate_allupdate_attributeupdate_columnupdate_columnsupdate_countersupsertupsert_all
ActiveRecord 还提供了许多校验辅助方法来处理日常的校验逻辑,如:
- acceptance: 确认表单的 checkbox 是否被标记
- validates_accociated: 确认关联对象
- confirmation: 确认字段和指定字段是否有相同的内容
- exclusion: 确认指定的属性不会出现在特定的可枚举对象中
- format:确认指定的属性值是匹配提供的正则表达式
- inclusion:确认指定的属性是否是一个特定的可枚举对象中的一个有效值
- presence: 确认指定的属性是否为空
- uniqueness:确认指定的属性在系统中是否是唯一的
回调
回调是 ActiveRecord 提供的另外一个高级功能。它能够控制模型对象的生命周期,从创建->更新->删除,借助回调方法将指定的代码插入到中间的过程融入对象的周期,类似数据库中触发器的概念,通过回调方法可以执行一些特殊的监控操作或者对数据进行校验等
ActiveRecord 中的回调方法有许多入口,大部分是以 before 和 after 形式来命名的。
实现回调的方式有两种,一种是直接定义相关的回调方法,以 Project 和 Task 模型为例,在 Task 更新后同时更新关联的 Project 的更新时间,可以这样实现
class Task < ApplicationRecord
def after_save
self.project.updated_at = Time.now
self.project.save
end
end
或者使用声明回调处理器
class Task < ApplicationRecord
after_save :update_project_time
def update_project_time
self.project.update_at = Time.now
self.project.save
end
end
具体可查看官网文档 guides.rubyonrails.org/active_reco…