2011-04-16 18 views
89

मेरे पास एक मॉडल ए है जिसमें एक अन्य मॉडल बी के लिए "has_many" एसोसिएशन है। मेरे पास एक व्यावसायिक आवश्यकता है कि ए में डालने के लिए कम से कम 1 संबंधित रिकॉर्ड की आवश्यकता है। क्या कोई तरीका है जिसे मैं यह सुनिश्चित करने के लिए कह सकता हूं कि यह है सच है, या मुझे कस्टम सत्यापन लिखने की ज़रूरत है?रेल - एसोसिएशन की सटीक पहचान?

उत्तर

140

आप उपयोग कर सकते हैं validates_presence_ofhttp://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 

लेकिन वहाँ इसके साथ एक बग है अगर आप :allow_destroy => true साथ accepts_nested_attributes_for का उपयोग करेगा: Nested models and parent validation। इस विषय में आप समाधान पा सकते हैं।

+3

'has_many उपयोग करने की आवश्यकता: lulz bs' – Archonic

6

आप validates_existence_of के साथ भी संगठन को मान्य कर सकते हैं (जो एक प्लगइन है):

उदाहरण this blog entry से स्निपेट:

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 notes in the comments के रूप में, validates_associated जांचता है कि संबंधित ऑब्जेक्ट संबंधित क्लास सत्यापन चलाकर मान्य है या नहीं। यह उपस्थिति की जांच करता है। यह भी ध्यान रखना महत्वपूर्ण है कि एक नील एसोसिएशन मान्य माना जाता है।

14

-------- रेल 4 ------------

सरल validatespresence के लिए मुझे

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 सहेजने से पहले उपयोगकर्ता को संबद्ध करना होगा।

0

आप यह सुनिश्चित करना है कि संघ दोनों वर्तमान और वैध होने की गारंटी है चाहते हैं, आप भी

class Transaction < ActiveRecord::Base 
    belongs_to :bank 

    validates_associated :bank 
    validates :bank, presence: true 
end 
संबंधित मुद्दे