Ruby Academy · レッスン

バリデーションとクエリ

データ整合性とクエリです。

レッスン 4/413 ステップ

「バリデーションとクエリ」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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 は、同じメールアドレスを持つユーザーが2人いる場合のような重複値を防ぎます。負荷の高い並行処理では、バリデーションだけでは競合状態が発生するため、一意なデータベースインデックスと組み合わせてください。

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

valid? と errors

valid? を呼び出すと、保存せずにバリデーションを実行できます。保存に失敗した後は、record.errors に問題が保持され、errors.full_messages でUIに表示しやすい文字列を取得できます。

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

save と save! の違い

保存には2つの方法があります。

  • 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 から始まります。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、集計、スコープを組み合わせて遅延評価されるクエリを構築します。

これでModels and Active Recordコースは完了です。

無料で開始

AI チューターと学ぶ Ruby — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
29
レッスン
109

よくある質問

「バリデーションとクエリ」レッスンは無料ですか?

はい。「バリデーションとクエリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「バリデーションとクエリ」で何を学びますか?

データ整合性とクエリです。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「バリデーションとクエリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Active Record の基礎
  2. マイグレーション
  3. 関連付け
  4. バリデーションとクエリ
← Ruby Academyに戻る