year
が空かどうかで month
の条件を切り替えているのがポイントです。
ついでに year
が未来の年でないかもチェックしています。
validates :year,
numericality: {
only_integer: true,
greater_than_or_equal_to: 1900,
less_than_or_equal_to: ->(_model) { Date.today.year }
},
allow_nil: true
validates :month,
numericality: {
only_integer: true,
greater_than_or_equal_to: 1,
less_than_or_equal_to: 12
},
allow_nil: true,
unless: ->(model) { model.year.nil? }
validates :month,
absence: true,
if: ->(model) { model.year.nil? }