何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

[Railsメモ] delegateメソッドとwith_optionsメソッドを使ってフラグごとにバリデーションを書く

お仕事でこの書き方をみたとき何も分からなかったので整理する意味でまとめてみました。

前提知識

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