質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1901閲覧

Railsのenumを利用した中間テーブルに複数のカラムを使ったユニーク制約の付け方が分かりません

zuck_

総合スコア20

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/08/25 09:43

編集2021/08/29 14:41

悩んでいる事

タイトル通り、Railsのenumを利用した中間テーブルに複数のカラムを使ったユニーク制約の付け方が分かりません。
一般的な、2つのテーブルを絡めた中間テーブルのユニーク制約の付け方は以下のようにすることは理解しています。

class C < ActiveRecord::Base validates :a_id, uniqueness: { scope: :b_id } end

しかしながら、以下のようなモデルの場合どのように制約を付ければ良いのか分かりません。
Aというテーブルに対して、Cという中間テーブルがあってそのCという中間テーブルを構成するのが、A_idとCの中にあるbというenumの要素です

class C < ActiveRecord::Base enum b: { 'abc' => 0, 'def' => 1 }, _prefix: true validates : ここにユニーク制約を付けたい(a_idと、enum bに対して) end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

enum かどうかは、ユニーク制約には関係ないと思います。enum とは、単にカラムの呼び方の alias と解釈していいですよね。
以下のようにすれば制約をつけられるでしょう。

ruby

1class C < ApplicationRecord # Rails 5+ の継承。Rails 4ならばActiveRecord::Base 2 belongs_to :a 3 enum b: { 4 'abc' => 0, 5 'def' => 1 6 }, _prefix: true 7 8 validates :a_id, uniqueness: { scope: :b } # Rails 3+(?) 9 # validates_uniqueness_of :a_id, scope: :b # Rails 5+(?) 10end 11

Test

ruby

1% bin/rails console 2a1 = A.create! title: 'My Title 1' # titleカラムがあると仮定 3c1 = Cenum.create! a: a1, b: 'abc' # OK 4c2 = Cenum.create! a: a1, b: 'def' # OK 5c3 = Cenum.create! a: a1, b: 'abc' # => ActiveRecord::RecordInvalid 6c3 = c1.b_def! # => ActiveRecord::RecordInvalid

投稿2021/09/02 09:42

編集2021/09/02 09:50
MasaSakano

総合スコア188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zuck_

2021/09/08 07:36

的確なご指摘ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問