Rails - İlişkilendirme Varlığını Doğrula?


108

Başka bir B modeliyle "has_many" ilişkisine sahip bir A modeline sahibim. A'ya bir ekin B'ye en az 1 ilişkili kayıt gerektirmesine yönelik bir iş gereksinimim var. Bunun doğru olduğundan emin olmak için arayabileceğim bir yöntem var mı, veya özel bir doğrulama yazmam gerekiyor mu?

Yanıtlar:


168

Http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of kullanabilirsinizvalidates_presence_of

class A < ActiveRecord::Base
  has_many :bs
  validates_presence_of :bs
end

veya sadece validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base
  has_many :bs
  validates :bs, :presence => true
end

Ancak şunlarla kullanacaksanız, bir hata accepts_nested_attributes_forvar :allow_destroy => true: İç içe modeller ve üst öğe doğrulaması . Bu konuda çözüm bulabilirsiniz.


18

-------- Raylar 4 ------------

validates presenceBenim için basit çalıştı

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Bu şekilde, Profile.createşimdi başarısız olacak. user.create_profileBir kullanıcıyı kaydetmeden önce kullanmalı veya ilişkilendirmeliyim profile.


6

İlişkilendirmeleri validates_existence_of(bir eklenti olan) ile doğrulayabilirsiniz :

Bu blog girişinden örnek pasaj :

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

Alternatif olarak kullanabilirsiniz validates_associated. As Faysal yorumlarda notlar cevap aşağıda, validates_associatedçekler ilişkili nesne ilişkili sınıf doğrulamaları çalıştırarak geçerli olup olmadığını. O mu değil varlığı için kontrol edin. Bir sıfır ilişkisinin geçerli kabul edildiğini unutmamak da önemlidir.


4

İlişkilendirmenin hem mevcut olduğundan hem de geçerli olacağından emin olmak istiyorsanız, şunu da kullanmanız gerekir:

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

Eğer ek bir seçenek geçebileceği eğer hoş olmaz validatesgibi valid: trueyerine çağırmak zorunda validates_associatedayrı.
Joshua Pinter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.