RailsのActiveRecordでDB制約やデータベースビューを使えるgem(README翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。RailsのActiveRecordでDB制約やデータベースビューを使えるgem(README翻訳)hachi8833シェアツイートブックマークLINEこんにちは、hachi8833です。gemのREADME翻訳をお送りします。多くの機能がPostgreSQL寄りなので、PostgreSQLで使うとさらに幸せになれるかもしれません。概要README末尾のMITライセンスおよびリポジトリのライセンスに基づき翻訳・公開いたします。integrity)はよいものです。値の制約は、アプリのレベルよりもデータベースのレベルでかける方が、データを正しく保つ方法としてより強力になります。残念なことに、SQLを手書きせずにデータ完全性を実現しようとしても、ActiveRecordではそうしたサポートについて冷淡であり、許してすらくれません。Rein(発音はrainと同じ)は、データベース上のデータを正しく保つのに役立つさまざまなメソッドをActiveRecordのマイグレーションに追加するgemです。ReinのDSLで使えるメソッドはすべて逆操作が可能なので、Railsのマイグレーションで可逆的な操作を利用できます。gemをインストールします。マイグレーションに制約(constraint)を追加します。外部キー制約は、カラム内の値が別のテーブル内の行(row)の値を一致しなければならないことを指定します。「booksテーブルのauthor_idは、authorsテーブルのidにある値に限定したい」場合は、次のように書きます。:authors外部キー制約を追加しても、参照されるカラムにインデックスが自動で追加されるわけではありません。一般に、インデックスを追加することで外部キーのJOINを高速化できます。インデックスを作成するには、indexオプションを使います。trueReinは、テーブルに対応するカラム名を自動で推測します。明示的に指定したい場合は、referencedオプションやreferencingオプションを利用できます。:id参照先の行のひとつが更新または削除されたときの動作も指定できます。:cascadeDELETEやUPDATEで指定できる動作の全オプションを以下に示します。制約チェック時に、参照元の行がまだ存在している場合にはエラーを出力します。オプションを指定しない場合はデフォルトでこの動作になります。参照先の行が削除されたときに、参照元の行も同時に削除されなければならないことを指定します。参照先の行が削除されたときに、参照元のカラムにNULLを設定します。参照先の行が削除されたときに、参照元のカラムにデフォルト値を設定します。参照先の行の削除を禁止します。外部キー制約を削除するには、次を使います。:authorsinclusion制約inclusion制約は、カラムに設定できる値のリストを指定します。「stateカラムの値はavailableかon_loanの2つのみを取れる」ようにするには、次のようにします。on_loan]inclusion制約を削除するには、次を使います。:stateifオプションも併用すると、次のように特定の条件を満たす場合にのみ制約をかけることもできます。NULL"nameオプションで名前をカスタマイズすることもできます。長さ制約は、文字列カラムの値が取れる長さの範囲を指定します。「call_numberの長さを1から255の間にする」には次のようにします。255長さ制約の全オプションを以下に示します。equal_tonot_equal_toless_thanless_than_or_equal_togreater_thangreater_than_or_equal_toifオプションも併用すると、次のように特定の条件を満たす場合にのみ制約をかけることもできます。'published'"nameオプションで名前をカスタマイズすることもできます。"books_call_number_is_valid"長さ制約を削除するには、次を使います。数値カラムが取れる値の範囲を指定します。「publication_monthの値は1から12の間だけを取れる」ようにするには、次のようにします。12数値制約の全オプションを以下に示します。equal_tonot_equal_toless_thanless_than_or_equal_togreater_thangreater_than_or_equal_toifオプションも併用すると、次のように特定の条件を満たす場合にのみ制約をかけることもできます。'published'"nameオプションで名前をカスタマイズすることもできます。"books_publication_month_is_valid"数値制約を削除するには次のようにします。:publication_monthpresence制約presence(存在)制約は、文字列カラムの値が空にならないよう指定します。NULL制約は空文字列でも満たされますが、文字列に(NULLでない)何らかの値があることを保証するには、次のようにします。:title特定の条件が満たされる場合にのみ制約をかけたい場合は、ifオプションを渡します。'published'"nameオプションで名前をカスタマイズすることもできます。"books_isbn_is_valid"presence制約を削除するには、次のようにします。:titleNULL制約NULL制約は、カラムにNULL値が含まれていないことを保証する制約です。NULL制約を加えることと同じですが、条件を指定できる点が異なります。「本がon_loan(貸出中)の場合のみdue_dateが必ずあるようにする」には、次のようにします。'on_loan'"NULL制約を削除するには、次のようにします。列挙型(enum)は、静的かつ順序の変わらない値のセットを表します。hardcover]データベースから列挙型を削除するには、次のようにします。Reinを使うと、データベースでビューをサポートするActiveRecordモデルも作成できるようになります。「現在貸出可能な本のリストを返すavailable_booksというビューを定義する」には、次のようにします。'available'"ビューをデータベースから削除するには、次のようにします。:available_booksスキーマひとつのデータベースには、名前付きスキーマ(複数可)を含めることができます。この名前スキーマにはテーブルが含まれることになります。データベースを複数のスキーマに分割して、複数のテーブルを論理的にグループ化すると便利な場合があります。:archiveスキーマをデータベースから削除するには、次のようにします。簡単な図書館貸出アプリを用いて、データベースの値に制限を追加するマイグレーションの実例をいくつか見てみましょう。Licenseに基いて公開しています。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。