inuinu blog(開発用)

BOT @wagagun の開発ノウハウや、IT向け?の雑記ブログです。

【Ruby on Rails7】cocoonを導入(その11:子の重複チェックを行いたい)

この記事では、Ruby on Rails7のgemパッケージcocoonについて、導入・カスタマイズ行います。
今回は子の値の重複チェックを行いたい場合の処理手順を説明します。

前回の続き。

inuinu-tech.hatenablog.jp

今回の処理範囲

もし、親側に新たにユニークキーを追加して、重複(一意性の)チェックを行いたい場合は、下記の記事をご参照ください。

inuinu-tech.hatenablog.jp

今回は子側の重複チェックになります。

実装手順

モデルに追記する

app/models/project.rbに次の行を追記します。

  # 子供側の重複チェックは親側で行う
  validate :check_uniqueness_tasks
(中略)
  private

  # 子供側の重複チェックは親側で行う(チェックロジック)
  def check_uniqueness_tasks
   # 明細のdescriptionの値を配列化する
   description = tasks.map(&:description)
   # uniqで重複値を除いた数と、明細の件数が一致しない場合にエラーとする
   errors.add(:base, 'descriptionが重複しています。') if description.uniq.length != description.length
  end

配列.uniqは重複した値を除いた配列を戻す関数ですので、それを利用します。

テーブルtasksにあるdescriptionがダブっている場合、description.uniq.lengthdescription.lengthが一致しないので、その場合、エラーを追加します。

:baseについて

errors.add():baseを使った場合、特定の項目にclassfield_with_errorsが挿入されないようです。

子の重複チェックで、特定の項目を赤くしたいということは、困難だと思いますので、そこは説明し、クライアントを納得させてください。