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


107

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

回答:


167

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_ofを使用できます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ネストされたモデルと親の検証。このトピックでは、解決策を見つけることができます。


18

-------- 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今は失敗します。をuser.create_profile保存する前に、ユーザーを使用または関連付ける必要がありますprofile


6

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ファイサルのコメントでノート答え以下、validates_associatedチェック関連するオブジェクトは、関連するクラスの検証を実行して、有効である場合。存在を確認しませ。また、nilの関連付けは有効と見なされることに注意することも重要です。


4

関連付けが存在し、有効であることが保証されていることを確認したい場合は、

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

個別に呼び出すのではなく、validateslike valid: trueに追加のオプションを渡すことができればいいのではないでしょうかvalidates_associated
ジョシュアピンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.