web-dev-qa-db-ja.com

Rails-関連の存在を検証しますか?

別のモデルBとの「has_many」関連付けを持つモデルAがあります。Aへの挿入にはBに少なくとも1つの関連レコードが必要であるというビジネス要件があります。これを確認するために呼び出すことができるメソッドはありますか、または、カスタム検証を記述する必要がありますか?

101
skaz

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

または単にvalidateshttp://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を使用する場合、バグがあります: ネストされたモデルと親の検証 。このトピックでは、解決策を見つけることができます。

156
fl00r

-------- Rails 4 ------------

シンプルvalidatespresenceは私のために働いた

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を使用するか、ユーザーを関連付ける必要があります。

16
hexinpeter

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アソシエーションが有効と見なされることに注意することも重要です。

6
Spyros

関連付けが存在し、有効であることが保証されていることを確認したい場合は、使用する必要もあります。

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end
1
Sukeerthi Adiga