Rails 手册 | 12 - Rails ORM 校验与回调

74 阅读1分钟

校验

在 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 映射到数据库

图片.png

图片.png

添加校验代码

class Person < ApplicationRecord
  validates :name, presence: true
end

在以下方法执行时会进行校验

  • create
  • create!
  • save
  • save!
  • update
  • update!

以下方法执行时不会校验

  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • insert
  • insert!
  • insert_all
  • insert_all!
  • toggle!
  • touch
  • touch_all
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters
  • upsert
  • upsert_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…