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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

481閲覧

モデルのバリデーションでuserとしてログインしている場合にはskipしたい。

IRIESS

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/30 11:05

編集2021/07/01 12:01

前提・実現したいこと

現在hostモデルとuserモデル間の契約であるAgreementモデルのカスタムvalidateを作成しています。
以下の条件を満たすvalidateを作成したいと考えています。

1.同一userは契約期間(start_timeとfinish_timeの差分)が重複したagreementを持てない
2.同一hostはuser_idと契約期間が重複したagreementは持てない

つまりuserは体一つなので同じ時間帯に二つも契約できないよ。
hostは企業なのでたくさんuserを雇えるよ。
ということです。
説明が下手ですみません。

この条件を満たす自作validateの作り方をご教授おねがいします。

deviseのuser_signed_inが使えれば見えてきそうな気がするのですが、modelファイルでは使用できないようでした。。。

該当のソースコード

ruby

1class Agreement < ApplicationRecord 2 belongs_to :user 3 belongs_to :host 4 5 validate :duplication 6 7 def duplication 8 if user_signed_in? 9 result = Agreement.where('finish_time >= ? && ? >= start_time', start_time, finish_time) 10 unless result.blank? 11 errors.add(:start_time, "入力した勤務時間が別の勤務時間と重複しています。") 12 end 13 end 14end 15

追記

ruby

1def duplication_of_work_hours_for_same_user 2 result = Agreement.where('finish_time >= ? && ? >= start_time && user_id = ?', start_time, finish_time, user_id) 3 unless result.blank? 4 errors.add(:start_time, "勤務時間が他の勤務時間と重複しています。") 5 end 6 end 7

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

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

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

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

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

guest

回答1

0

ベストアンサー

1だけやれば良いのでは?1が成立すれば2は成立するでしょう。
で、
validateする Agreement には user_id が有るでしょうから、それを使って
Agreementのuser_idのもののなかに、期間が重なるものが有るかどうかみれば良いです。
exists?("start_time < ? and finish_time > ?",[finish_time, start_time])
かな

質問のタイトルと内容が乖離してますが、内容の方で回答しました

投稿2021/06/30 14:23

編集2021/06/30 14:34
winterboum

総合スコア23401

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

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

IRIESS

2021/07/01 12:08

userとhostがログインしている場合でバリデーションを分けないといけないと考えたり、実現したい条件から適切にシンプルな方法を導き出せませんでした。 訂正後のコードを追記しました。 ご教授ありがとうございました。
winterboum

2021/07/01 12:28

exists? の方がシステムの負荷低いですし、意味合いが人間にもわかりやすいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問