#制約とは
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
いろいろな制約を使いこなす事で、サービスにおいて、ユーザー側からの意図しないデータの入力を防ぐ事が可能になります。