रेल - एसोसिएशन की मान्य उपस्थिति?


107

मेरे पास एक मॉडल A है, जिसका दूसरे मॉडल B के लिए "has_many" एसोसिएशन है। मेरे पास एक व्यावसायिक आवश्यकता है जो 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/valates

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

लेकिन इसके साथ एक बग है यदि आप इसके accepts_nested_attributes_forसाथ उपयोग करेंगे :allow_destroy => true: नेस्टेड मॉडल और माता-पिता का सत्यापन । इस विषय में आप समाधान पा सकते हैं।


18

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


4

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

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

यदि आप अलग से कॉल करने के बजाय validatesपसंद valid: trueकरने के लिए एक अतिरिक्त विकल्प पारित कर सकते हैं तो यह अच्छा नहीं होगा validates_associated
जोशुआ पिंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.