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

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

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

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

Q&A

解決済

2回答

6012閲覧

railsでアプリを作っています。DBのnull:falseとモデルでのvalidatesでのpresence trueの違いを教えてください

dongw

総合スコア119

Ruby on Rails

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

1グッド

2クリップ

投稿2016/12/24 08:35

railsでマイグレーションファイルのカラムに

null:false
をつけるのと、

モデルで
validate :name presence: true
をつけるのは役割が被っている気がするのですが、厳密には違うのでしょうか?

また、併記する必要があるのか?
どっちかでいいのか?
曖昧な認識でしかないので詳しい方教えていただけるとありがたいです。

yukkys👍を押しています

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

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

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

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

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

guest

回答2

0

モデルのバリデーションは、想定しうる入力の間違いをチェックするものですが、
自分が想定していなかったものはすり抜けてしまいます。
最後の砦、保険となるのが、DB側の制約です。

モデルを修正していくうちに、validate :name presence: true を
うっかり削除してしまうかもしれないし、
新規に作ったモデルで付け忘れる可能性もあります。

重複しているように見えても役割は別物なので、モデルのバリデーションもDB側の制約もきちんと設定すべきです。

投稿2016/12/26 02:26

mingos

総合スコア4025

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

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

0

ベストアンサー

railsの動作ですが

migrationファイルに
:name#, :null => false
と記載した場合にモデルのインスタンスをsaveすると
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "name" violates not-null constraint
というエラーがraiseされます。(postgresの場合)

モデルに
validates :name, presence: true
と記載した場合はrails側でのチェックが走りますので、
モデルのインスタンスに対して #save、 #valid? などを実行した場合falseが返り、インスタンスのerrorsにエラーがセットされます。

上の結果から

  • データベースにチェックしてもらうよりも事前にチェックしたほうが安全
  • 同じモデルに対して他のvalidationも併用する場合にmigrationファイルに定義すると、チェックするタイミングがずれる

ため、modelで定義するほうがいいかと思います。

また、通常(scaffoldなどで)作成したcontrollerでは

ruby

1def create 2 model = Model.new(model_params) 3 4 if model.save 5 # 成功時の処理 6 else 7 # unprocessable entity(422)などのvalidationエラーの処理 8 end 9end

のようになるので、railsではmodelでvalidationを定義することを前提にしてそうです。

投稿2016/12/24 17:03

satoshih

総合スコア797

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

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

dongw

2016/12/25 12:46

コメントありがとうございます! modelにvalidationをかけたほうがfalseが返ってくるのでフラッシュメッセージなどにも利用でき、いろいろと再利用できますよね ただ、DBにnull不許可とモデルにバリデーションをかけたほうがより安全(二重だから) DBを直接いじる機会にnullがまちがって入ってしまうと危険だからDBにもnull不許可する、ということも聞いたのですが、この事についてはどう思いますか?
satoshih

2016/12/26 00:54

> DBを直接いじる機会 そうですね そういう機会があるのであれば、おっしゃる通り2重に(applicationとDB両方で)かけておくほうが安全だとおもいます (そんな機会が無いことを祈っときます。
dongw

2016/12/26 07:27

ありがとうございます。 ベストアンサーにいたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問