前回の続き。
今回の処理範囲
もし、親側に新たにユニークキーを追加して、重複(一意性の)チェックを行いたい場合は、下記の記事をご参照ください。
今回は子側の重複チェックになります。
実装手順
モデルに追記する
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.length
とdescription.length
が一致しないので、その場合、エラーを追加します。
:baseについて
errors.add()
で:base
を使った場合、特定の項目にclassfield_with_errors
が挿入されないようです。