0Pricing
Ruby Academy · 课时

验证与查询

数据完整性与查询

验证与查询 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。

为何进行验证

验证会在数据进入数据库前保护数据。保存记录时会执行验证,并通过有帮助的消息拒绝无效数据。

  • 验证会阻止错误数据进入数据库(例如缺少姓名、格式错误的电子邮件)。
  • 验证在 Ruby 中运行,因此很容易向用户显示消息。
  • 验证是数据库约束的补充,而不是替代。

存在性验证

最常见的规则是 validates :field, presence: true,它要求值不能为空。不填写该值就保存会失败,并记录错误。

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

# User.create(name: "") fails to save

唯一性验证

uniqueness: true 可以防止值重复,例如防止两个用户使用相同的电子邮件。请将它与唯一数据库索引配合使用,因为仅依赖验证在高并发情况下会产生竞态条件。

class User < ApplicationRecord
  validates :email, presence: true, uniqueness: true
end

格式与长度

其他内置验证器包括:

  • length: { minimum: 8 } 用于限制长度。
  • format: { with: /regex/ } 用于检查模式。
  • numericality: true 用于检查数值。
  • inclusion: { in: [...] } 用于限制允许的值。
class User < ApplicationRecord
  validates :password, length: { minimum: 8 }
  validates :age, numericality: { greater_than: 0 }
end

有效性检查与 errors

调用 valid? 可以在不保存的情况下运行验证。保存失败后,record.errors 会保存相关问题,而 errors.full_messages 会为界面提供易读的字符串。

user = User.new(name: "")
if user.valid?
  user.save
else
  puts user.errors.full_messages
end

保存与强制保存

有两种保存方式:

  • save 会返回 true/false,因此您可以根据结果进行分支处理。
  • save! 失败时会引发 RecordInvalid,适用于应将无效数据视为异常的情况。

同样的模式也适用于 create/create! 和 update/update!。

user.save   # => false if invalid
user.save!  # => raises if invalid

自定义验证

对于超出内置验证器范围的规则,请编写一个方法,并使用 validate 注册它。请通过 errors.add 添加问题。

class User < ApplicationRecord
  validate :name_not_admin

  def name_not_admin
    if name == "admin"
      errors.add(:name, "cannot be admin")
    end
  end
end

使用 where 查询

查询接口从 where 开始,它用于筛选行。它会返回一个延迟执行的关系,在查询访问数据库之前,您可以继续对其进行链式调用。

User.where(active: true)
User.where("age > ?", 18)
User.where(role: ["admin", "editor"])

排序与限制

使用可链式调用的方法整理结果:

  • order(created_at: :desc) 用于排序。
  • limit(10) 和 offset(20) 用于分页。
  • select(:id, :name) 用于选择列。
User.where(active: true)
    .order(created_at: :desc)
    .limit(10)

聚合与延迟加载

聚合辅助方法会执行数据库函数:count、sum(:amount)、average(:age)、maximum 和 minimum。关系是延迟执行的;只有在枚举关系、调用聚合方法或使用 to_a 时,查询才会运行。

User.where(active: true).count
Order.sum(:total)
User.average(:age)

作用域

作用域可以为可复用的查询命名,从而让您能够清晰地组合查询。作用域会返回关系,并且可以相互链式调用,也可以与 where 链式调用。

class User < ApplicationRecord
  scope :active, -> { where(active: true) }
  scope :adults, -> { where("age >= ?", 18) }
end

User.active.adults

快速检查

请测试您对验证和查询的理解。

回顾:验证与查询

您已经学会了如何保护和获取数据:

  • 存在性、唯一性、长度和格式等验证可以保护保存操作。
  • valid? 和 errors 会报告问题;save! 会引发异常。
  • 自定义验证可以处理特殊规则。
  • where、order、limit、聚合方法和作用域可以构建延迟执行的查询。

模型与 Active Record 课程到此完成。

常见问题解答

「验证与查询」课时是免费的吗?

是的 — 「验证与查询」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「验证与查询」这节课中我会学到什么?

数据完整性与查询 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「验证与查询」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Active Record 基础
  2. 迁移
  3. 关联
  4. 验证与查询
← 返回 Ruby Academy