お仕事でこの書き方をみたとき何も分からなかったので整理する意味でまとめてみました。
前提知識
with_optionsメソッド
共通しているオプションをまとめられる便利なやつ
https://api.rubyonrails.org/classes/Object.html#method-i-with_options
delegateメソッド
うまく説明できないが、メソッドを呼び出すのを簡略化してくれるやつ
https://api.rubyonrails.org/classes/Module.html#method-i-delegate qiita.com
バリデーションのサンプルコード
- スキーマ
ActiveRecord::Schema.define(version: 2020_12_01_125955) do create_table "bars", force: :cascade do |t| t.integer "foo_id" t.string "test_string" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end create_table "foos", force: :cascade do |t| t.integer "flag", default: 0 t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end end
class Foo < ApplicationRecord has_many :bars enum flag: { a: 0, b: 1, c: 2 } end class Bar < ApplicationRecord belongs_to :foo delegate :a?, to: :foo, prefix: false, allow_nil: true with_options if: :a? do # flagのオブジェクトのflagがaの時のバリデーションを書く validates :test_string, presence: true end with_options unless: :a? do # fooのオブジェクトのflagがa以外の時のバリデーションを書く validates :test_string, presence: true, length: {maximum: 3} end end