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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

3回答

1311閲覧

Railsで validates_uniqueness_of の逆(?)でバリデートしたい

torneco

総合スコア7

SQL

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2016/03/20 05:34

Rails4.2の質問です。


idcontentauthor_iduser_id
1本文A21
2本文B42
3本文C34
4本文D13
5本文E42

上記のような、 id, content, author_id, user_id カラムを持つテーブルがあります。

このようなモデルで、

  • 同一user_idであれば、author_id はひとつだけ
    • 例: user_id が2なら、author_id4のみしか許容しない

というバリデーションをかけたいのですが、何か良い方法はあるでしょうか?
(モデルの設計がイマイチなのですが、既存の構成を変えずに済ませたいです。。。)

よろしくお願いします!

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

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

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

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

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

guest

回答3

0

????
user_id が 2 なら author_id は4のみ。 というのは、

user_id に対して author_id がユニーク

でよいのではないでしょうか?

投稿2019/07/11 09:29

winterboum

総合スコア23329

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

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

0

全体が見えないので当てずっぽうで答えますが、author_iduser_id を管理するモデルを別途作成し、その新しいモデルの id を使ってこのテーブルに保存するのが正解だと思います。
または、そもそも user model に author_id を保存できるようにするか。

それが不適当だと思う場合には、カスタムバリデーションを定義してしまうのが手っ取り早いですかね…。

全体の設計が見えてこないので適切な答えも見えてこないですかね。
でも、もし「テーブルの数をこれだけのために増やすのはもったいない」とかそういう考えであれば、迷わず増やす方を選ぶことをお勧めします。

投稿2016/03/24 07:35

編集2016/03/24 07:44
HAZI

総合スコア31

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

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

torneco

2016/04/06 06:01

設計がそもそもイマイチなのですが、手軽に対応できる方法を探していました。カスタムバリデーションだと毎回他レコードを走査する必要があるのでパフォーマンス的にどうかなあと二の足を踏んでいました。。ご回答ありがとうございました!
HAZI

2016/04/11 03:53

多分ですが、多少面倒なことをしないとどちらにしろ SQL クエリーの節約にはならないと思います(複合INDEX指定など)。普通のバリデーションも普通に SQL が裏側では走るものなので、そのコストはそこまで気にしないで大丈夫だと思います。 今回の場合、もし負荷がかかるようであればテーブル構造からの見直しをするしかないのかなと想像します。
guest

0

お探しのものは、 validates_uniqueness_of の scope オプションですか?

投稿2016/03/22 08:54

hello-world

総合スコア1342

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

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

torneco

2016/03/22 09:05

ご回答ありがとうございます。いいえ、`scope: :user_id` で、`author_id` がユニークではない(同じ値)、を実現したいんです。。 `validates_uniquness_of: author_id, scope: :user_id ` だと、ユニークになってしまいますよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問