19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Rails]テーブルにおける制約の種類まとめ

Posted at

#制約とは
Railsに関してマイグレーションファイル(テーブル作成の設計図)に特定の記述を行うと、
テーブルのカラムやレコードにある特定の条件(これを制約という)を設ける事ができる。

簡単にいえば、テーブルの設計図に特定の記述を行うとテーブルに「この値は入れる事が出来ません」などの設定が可能。

##NOT NULL制約

NOT NULL制約は特定のテーブルの属性値にNULL(空の値)が入ることを許さない(NOT)制約です。
例えば、以下のようにusersテーブルのnameというカラムにNOT NULL制約を設定すると
nameが空(nil)レコードは保存できなくなります。

NOT NULL制約を付けたいカラムの末尾にnull: falseを付けます。

マイグレーションファイル
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name, null: false
    end
  end
end

##一意性制約

一意性制約はテーブル内で重複するデータを禁止する制約です。
例えばユーザーに同じアドレスで登録してほしくない時などに設定します。
emailカラムに対して一意性制約を設定すると同じemailのレコードは保存できなくなります。

Railsではadd_indexメソッドを使用してその後unique: trueを末尾につける事で使用可能です。

マイグレーションファイル
class AddEmailToUsers < ActiveRecord::Migration
  def change
    add_column :users, :email, :string
    add_index :users, :email, unique: true
  end
end

##主キー制約

主キー制約は、主キーである属性値が必ず存在してかつ重複していないことを保証する制約です。
主キーに対してNOT NULL制約と一意性制約を両方設定するのと同義になります。

Railsでテーブルを作成する際、主キー制約は元々実装されています。
Railsでは主キーはidカラムとして自動で作成されます。つまりidカラムの値は重複しないようにできています。

##外部キー制約

外部キー制約は、外部キーの対応するレコードが親元のテーブルのレコードにも必ず存在しなくてはいけないという制約です。
外部キーのカラムに値があっても、その値を主キーとして持つ他のテーブルのレコードがなければいけません。

外部キー制約を付けたいカラムの末尾にforeign_key: trueをつけます。
この時カラムの型がreferencesになっている事にも注意してください。

マイグレーションファイル
class CreateScores < ActiveRecord::Migration
  def change
    create_table :scores do |t|
      t.string :name
      t.integer :score
      t.references :user, foreign_key: true
      t.timestamps null: false
    end
  end
end

いろいろな制約を使いこなす事で、サービスにおいて、ユーザー側からの意図しないデータの入力を防ぐ事が可能になります。

19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?