ハッキングバカ

プログラミングに関するメモ

has_many で持つ Model の数を validate する[Rails]

環境: rails 5.2.0
Shop モデルが has_many で Product モデルを持つとき、その個数を1~32個の間に指定するような validation が欲しい。
一つは自分で作ること。
参考: Rails Model で has_many 定義した要素数を validate する方法 - Shred IT!!!!

# app/model/shop.rb
...
validate :products_number
...
private

  def products_number
    errors.add(:products, "をつ以上指定して下さい") if products.size < 1
    errors.add(:products, "は32個までです") if products.size > 32
  end

これで問題はないのだけれど良くありそうな問題だしもっと良い解決法はないのかと思ったら length が使えるらしい。
参考: ruby on rails - Validate that an object has one or more associated objects - Stack Overflow

# app/model/shop.rb
validates :products, length: { minimum: 1, maximum: 32 }

こっちの方がシンプルに書けるのだが、length は基本的に文字数が前提のようでエラーメッセージが「商品は1文字以上必要です」のように違和感のある日本語になってしまう。
辞書ファイルをいじるのは面倒なので、一つ目の方を使う事にする。