別のモデルBとの「has_many」関連付けを持つモデルAがあります。Aへの挿入にはBに少なくとも1つの関連レコードが必要であるというビジネス要件があります。これを確認するために呼び出すことができるメソッドはありますか、または、カスタム検証を記述する必要がありますか?
validates_presence_of
を使用できます http://apidock.com/Rails/ActiveModel/Validations/ClassMethods/validates_presence_of
class A < ActiveRecord::Base
has_many :bs
validates_presence_of :bs
end
または単にvalidates
http://apidock.com/Rails/ActiveModel/Validations/ClassMethods/validates
class A < ActiveRecord::Base
has_many :bs
validates :bs, :presence => true
end
ただし、accepts_nested_attributes_for
で:allow_destroy => true
を使用する場合、バグがあります: ネストされたモデルと親の検証 。このトピックでは、解決策を見つけることができます。
-------- Rails 4 ------------
シンプルvalidates
presence
は私のために働いた
class Profile < ActiveRecord::Base
belongs_to :user
validates :user, presence: true
end
class User < ActiveRecord::Base
has_one :profile
end
これにより、Profile.create
は失敗します。 profile
を保存する前に、user.create_profile
を使用するか、ユーザーを関連付ける必要があります。
validates_existence_of
(これはプラグインです)で関連付けを検証できます:
このブログエントリ のスニペットの例:
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :taggable, :polymorphic => true
validates_existence_of :tag, :taggable
belongs_to :user
validates_existence_of :user, :allow_nil => true
end
または、 validates_associated
を使用できます。 Faisalコメント内のメモ が回答の下にあるため、validates_associated
は、関連するクラス検証を実行して、関連するオブジェクトが有効かどうかを確認します。存在をチェックしませんnot。また、nilアソシエーションが有効と見なされることに注意することも重要です。
関連付けが存在し、有効であることが保証されていることを確認したい場合は、使用する必要もあります。
class Transaction < ActiveRecord::Base
belongs_to :bank
validates_associated :bank
validates :bank, presence: true
end