Techioz Blog

アクティブなレコード内の関連テーブルにのみ検証を追加する方法

概要

Railsにアドレステーブルがあります。

class Address < ApplicationRecord
  validates :street, :city
            presence: { allow_blank: false }
end

テーブルは複数のテーブルに関連付けられており、番地と都市が null または “” にならないように検証を追加しましたが、この検証は関連付けられたテーブル ユーザーに対してのみ実行したいと考えていました。

class User < ApplicationRecord
  belongs_to :address
  validates_associated :address
end

ユーザーはアドレスにbelongs_toを持っていますが、アドレス内にbelongs_toを入れたくありません。テーブルがユーザーの場合にのみアドレス検証を機能させるにはどうすればよいですか?

解決策

住所に関連付けられているユーザーまたは少なくとも 1 人のユーザーがいるときに、通りと都市の存在のみを検証したい場合は、次のように検証定義に if 条件を追加します。

class Address < ApplicationRecord
  has_many :users

  validates :street, :city
            presence: { allow_blank: false },
            if: Proc.new { |a| a.users.present? }
end

class User < ApplicationRecord
  belongs_to :address

  validates_associated :address
end