テーブルの作成

テーブルを介して定義されます#create_table:このメソッドは2つの引数受け付けブロックデザインを表現します。

安全な操作を介して行うことができます#create_table?それが存在しない場合にのみ、テーブルを作成します。強制操作は介して行うことができます#create_table!これは、既存のテーブルを削除し、最初から新しいものを作成します。
これらの操作は、マイグレーションに使用すべきではありません

列定義

我々が使用する列を定義するには#column、続いて名前タイプおよびオプションを名前は、テーブル内で一意の識別子でなければなりません。

型は、Rubyタイプ(例えばすることができるString)、ルビー・タイプ(例えば表す記号:string)、または生のデータベースタイプ(例えば表す文字列"varchar(255)")。

型定義

次のRubyの種類がサポートされています。

  • String (varchar(255))
  • Numeric (numeric)
  • Fixnum (integer)
  • Integer (integer)
  • Bignum (bigint)
  • Float (double precision)
  • BigDecimal (numeric)
  • Date (date)
  • DateTime (timestamp)
  • Time (timestamp)
  • TrueClass (boolean)
  • FalseClass (boolean)
  • File (blob)

Rubyの型からデータベース型への彼らの翻訳は、データベースからデータベースに異なる場合があります。

オプション

これは、次のオプションをサポートしています。

  • :default (デフォルト値)
  • :index (列のインデックスを作成します)
  • :null (NULL値を許可するか否か)
  • :primary_key (テーブルの列の主キーを作成します)
  • :unique (列の一意性制約を追加)

主キー

私たちは、定義することができます主キー次の構文では:

column :id, Integer, null: false, primary_key: true
# or just use this shortcut
primary_key :id

外部キー

外部キーを介して定義されている#foreign_key私たちが指定した場所、名前欄の、参照テーブル、および一連のオプションを次の例では、作成author_id用カラム(整数)booksと外部キーを追加します。

create_table :books do
  # ...
  foreign_key :author_id, :authors, on_delete: :cascade, null: false
end

オプション

これは、以下のオプションを受け付けます。

  • :deferrable (トランザクションの終了時に制約チェック遅延可能にします)
  • :key (この列が関連付けられたテーブルの主キーを参照する場合、この列は参照不要な関連したテーブルの列)
  • :null (NULL値を許可するか否か)
  • :type (列タイプ)
  • :on_delete(参照レコードが削除された場合の対処法::restrict:cascade:set_null、または:set_default
  • :on_update(参照レコードが更新された場合の対処法::restrict:cascade:set_null、または:set_default

インデックス

インデックスは経由で定義されています#indexそれは受け入れ名(複数可)のカラム(複数可)、および一連のオプションを

create_table :stores do
  # ...
  column :code, Integer, null: false
  column :lat, Float
  column :lng, Float

  index :code, unique: true
  index [:lat, :lng], name: :stores_coords_index
end

オプション

これは、以下のオプションを受け付けます。

  • :unique (一意性制約)
  • :name (カスタム名)
  • :type (いくつかのデータベースでサポートされているインデックスのタイプ、)
  • :where (部分インデックス、いくつかのデータベースでサポートされています)

制約

私たちは、経由して、列に制約を定義することができます#constraintそれは受け入れ名前ブロックを

create_table :users do
  # ...
  column :age, Integer
  constraint(:adult_constraint) { age > 18 }
end

ブロックは、データベースエンジンのコンテキストで評価されることに注意してください、複雑なRubyのコードは動作しませんデータベースの機能は、Rubyの機能にマッピングされているが、これは、移行の移植性を低減します。

create_table :users do
  # ...
  column :password, String
  constraint(:password_length_constraint) { char_length(password) >= 8 }
end

小切手

小切手は、制約に似ていますが、受け入れる無名ブロックまたはSQL生の文字列を

create_table :users do
  # ...
  column :age, Integer
  column :role, String

  check { age > 18 }
  check %(role IN("contributor", "manager", "owner"))
end