2011-04-16 14 views
89

Başka bir model B ile "has_many" ilişkilendirmesi olan bir A modeline sahibim. A'nın bir ekleme yapmasının en az 1 ilişkilendirilmiş B kaydına sahip olmasını gerektiren bir iş gereksinimim var. Bunun olduğundan emin olmak için arayabileceğim bir yöntem var mı Doğru mu, yoksa özel bir doğrulama mı yazmalıyım?Raylar - Derneğin Varlığını Doğrulamak?

cevap

140

kullanabilirsiniz validates_presence_ofhttp://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

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

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

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

Ama :allow_destroy => true ile accepts_nested_attributes_for kullanacaksanız onunla bir hata vardır: Nested models and parent validation. Bu konuda çözüm bulabilirsiniz.

+3

'has_many kullanmak gerekir: lulz bs' – Archonic

6

Sen (bir eklenti olan) validates_existence_of ile ilişkilendirmeleri doğrulayabilir:

Örnek this blog entry bir 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, validates_associated kullanabilirsiniz. Yanıtın altında Faisal notes in the comments olarak, validates_associated ilişkili nesneyi ilişkili sınıf geçerliliklerini çalıştırarak geçerli olup olmadığını denetler. varlığını kontrol ediyor. Bir nil ilişkisinin geçerli kabul edildiğini belirtmek de önemlidir.

14

-------- 4 ------------

Basit validatespresenceProfile.create şimdi başarısız olur, bana

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates :user, presence: true 
end 

class User < ActiveRecord::Base 
    has_one :profile 
end 

Bu şekilde çalıştı Raylar . user.create_profile kullanmalıyım veya bir kullanıcıyı profile kaydetmeden önce ilişkilendirmeliyim. Eğer ilişki mevcut ve geçerli olması garanti hem olduğundan emin olmak istiyorsanız

0

, ayrıca

class Transaction < ActiveRecord::Base 
    belongs_to :bank 

    validates_associated :bank 
    validates :bank, presence: true 
end 
İlgili konular