Rein: RailsのActiveRecordでDB制約やデータベースビューを使えるgem(README翻訳)

こんにちは、hachi8833です。今回はRailsウォッチでもご紹介したRein gemのREADME翻訳をお送りします。 多くの機能がPostgreSQL寄りなので、PostgreSQLで使うとさらに幸せになれるかもしれません。 概要 README末尾のMITライセンスおよびリポジトリのライセンスに基づき翻訳・公開いたします。 英語README: rein 更新日: 2017/06/06 著者: Joshua Bassett サイト: https://joshbassett.info/ Rein: RailsのActiveRecordにDB制約を追加するgem(README翻訳) データ完全性(data integrity)はよいものです。 値の制約は、アプリのレベルよりもデータベースのレベルでかける方が、データを正しく保つ方法としてより強力になります。 残念なことに、SQLを手書きせずにデータ完全性を実現しようとしても、ActiveRecordではそうしたサポートについて冷淡であり、許してすらくれません。Rein(発音はrainと同じ)は、データベース上のデータを正しく保つのに役立つさまざまなメソッドをActiveRecordのマイグレーションに追加するgemです。 ReinのDSLで使えるメソッドはすべて逆操作が可能なので、Railsのマイグレーションで可逆的な操作を利用できます。 クイックスタート 1: gemをインストールします。 gem install rein 2: マイグレーションに制約(constraint)を追加します。 class CreateAuthorsTable < ActiveRecord::Migration def change create_table :authors do |t| t.string :name, null: false end # authorには必ずnameがあること add_presence_constraint :authors, :name end end 利用できる制約 外部キー制約 外部キー制約は、カラム内の値が別のテーブル内の行(row)の値を一致しなければならないことを指定します。 たとえば、「booksテーブルのauthor_idは、authorsテーブルのidにある値に限定したい」場合は、次のように書きます。 add_foreign_key_constraint :books, :authors 外部キー制約を追加しても、参照されるカラムにインデックスが自動で追加されるわけではありません。一般に、インデックスを追加することで外部キーのJOINを高速化できます。インデックスを作成するには、indexオプションを使います。 add_foreign_key_constraint :books, :authors, index: true Reinは、テーブルに対応するカラム名を自動で推測します。明示的に指定したい場合は、referencedオプションやreferencingオプションを利用できます。 add_foreign_key_constraint :books, :authors, referencing: :author_id, referenced: :id 参照先の行のひとつが更新または削除されたときの動作も指定できます。 add_foreign_key_constraint :books, :authors, on_delete: :cascade, on_update: :cascade DELETEやUPDATEで指定できる動作の全オプションを以下に示します。 no_action: 制約チェック時に、参照元の行がまだ存在している場合にはエラーを出力します。オプションを指定しない場合はデフォルトでこの動作になります。 cascade: 参照先の行が削除されたときに、参照元の行も同時に削除されなければならないことを指定します。 set_null: 参照先の行が削除されたときに、参照元のカラムにNULLを設定します。 set_default: 参照先の行が削除されたときに、参照元のカラムにデフォルト値を設定します。 restrict: 参照先の行の削除を禁止します。 外部キー制約を削除するには、次を使います。 remove_foreign_key_constraint :books, :authors inclusion制約 inclusion制約は、カラムに設定できる値のリストを指定します。 たとえば、「stateカラムの値はavailableかon_loanの2つのみを取れる」ようにするには、次のようにします。 add_inclusion_constraint :books, :state, in: %w[available on_loan] inclusion制約を削除するには、次を使います。 remove_inclusion_constraint :books, :state ifオプションも併用すると、次のように特定の条件を満たす場合にのみ制約をかけることもできます。 add_inclusion_constraint :books, :state, in: %w[available on_loan], if: “deleted_at IS NULL” nameオプションで名前をカスタマイズすることもできます。 add_inclusion_constraint :books, :state, in: %w[available on_loan], name: “books_state_is_valid” 長さ制約 長さ制約は、文字列カラムの値が取れる長さの範囲を指定します。 たとえば、「call_numberの長さを1から255の間にする」には次のようにします。 add_length_constraint :books, :call_number, greater_than_or_equal_to: 1, less_than_or_equal_to: 255 長さ制約の全オプションを以下に示します。 equal_to not_equal_to less_than less_than_or_equal_to greater_than greater_than_or_equal_to ifオプションも併用すると、次のように特定の条件を満たす場合にのみ制約をかけることもできます。 add_length_constraint :books, :call_number, greater_than_or_equal_to: 1, less_than_or_equal_to: 12, if: “status = ‘published'” nameオプションで名前をカスタマイズすることもできます。 add_length_constraint :books, :call_number, greater_than_or_equal_to: 1, less_than_or_equal_to: 12, name: “books_call_number_is_valid” 長さ制約を削除するには、次を使います。 remove_length_constraint :books, :call_number 数値制約 数値制約は、数値カラムが取れる値の範囲を指定します。 たとえば、「publication_monthの値は1から12の間だけを取れる」ようにするには、次のようにします。 add_numericality_constraint :books, :publication_month, greater_than_or_equal_to: 1, less_than_or_equal_to: … Continue reading Rein: RailsのActiveRecordでDB制約やデータベースビューを使えるgem(README翻訳)