2009-12-22 15 views
21

पहले ग्रेटर है, मुझे कहते हैं कि मैं अत्यंत नई रेल के लिए कर रहा हूँ दें (इसे साथ समय या दो toyed लेकिन अपने आप को अब यह के साथ एक पूर्ण परियोजना लिखने के लिए मजबूर कर रहा, कल उस पर शुरू कर दिया)।एक मॉडल संपत्ति सत्यापित किया जा रहा से एक और

अब मैं यह सत्यापित करने की कोशिश कर रहा हूं कि एक मॉडल संपत्ति (शब्दावली?) एक से अधिक है। यह के लिए greater_than विकल्प के साथ एक आदर्श उदाहरण प्रतीत होता है, लेकिन हां, जो मुझे greater_than expects a number, not a symbol बताते हुए एक त्रुटि फेंकता है। यदि मैं उस प्रतीक को टाइप करने का प्रयास करता हूं तो .to_f मुझे undefined method त्रुटि मिलती है।

यहां अंततः मैंने जो किया और मैं उत्सुक हूं कि कोई बेहतर तरीका है या नहीं। यह परियोजना रिलीज को नियंत्रित करने के लिए एक साधारण प्रणाली है, हमारे पास केवल प्रमुख/मामूली रिलीज (एक-डॉट) है, इसलिए यहां सही निर्णय की तरह फ़्लोट महसूस किया गया है।

class Project < ActiveRecord::Base 
    validates_numericality_of :current_release 
    validates_numericality_of :next_release 
    validate :next_release_is_greater 

    def next_release_is_greater 
     errors.add_to_base("Next release must be greater than current release") unless next_release.to_f > current_release.to_f 
    end 
end 

यह काम करता है - यह प्रासंगिक इकाई परीक्षण (आपके दृश्य मनोरंजन के लिए नीचे) से गुजरता है, मैं अगर वहाँ एक आसान तरीका है के रूप में बस उत्सुक हूँ - कुछ मैं अन्यथा की कोशिश की है हो सकता है।

प्रासंगिक इकाई परीक्षण:

# Fixture data: 
# PALS: 
#  name: PALS 
#  description: This is the PALS project 
#  current_release: 1.0 
#  next_release: 2.0 
#  project_category: 1 
#  user: 1 
def test_release_is_future 
    project = Project.first(:conditions => {:name => 'PALS'}) 
    project.current_release = 10.0 
    assert !project.save 

    project.current_release = 1.0 
    assert project.save 
end 

उत्तर

19

जैसा कि आपने देखा, एकमात्र तरीका एक कस्टम सत्यापनकर्ता का उपयोग करना है। : big_than विकल्प एक पूर्णांक होना चाहिए। निम्नलिखित कोड काम नहीं करेगा क्योंकि वर्तमान और अगली रिलीज दोनों केवल उदाहरण-स्तर पर उपलब्ध हैं।

class Project < ActiveRecord::Base 
    validates_numericality_of :current_release 
    validates_numericality_of :next_release, :greater_than => :current_release 
end 

greater_than विकल्प के प्रयोजन के लिए एक स्थिर निरंतर या एक अन्य वर्ग विधि के खिलाफ मूल्य मान्य करने के लिए है।

तो, ध्यान न दें और अपने कस्टम सत्यापनकर्ता के साथ आगे बढ़ें। :)

+0

बहुत बढ़िया जवाब, विस्तृत प्रतिक्रिया - मैं तो बस जो चाहते हैं उसे (साथ ही कुछ आश्वासन)। –

+0

ग्रेट उत्तर, कृपया "greather_than" मौका मिलने पर वर्तनी त्रुटि ठीक करें। एक बार फिर धन्यवाद। – ghayes

+0

हो गया, धन्यवाद। –

0

सबसे अच्छा तरीका कस्टम सत्यापन निष्पादित करने के लिए है कि, हालांकि, आप जुड़नार (जैसे आप उपयोग कर रहे हैं जो यह लग रहा है) के लिए एक स्थानापन्न के रूप factory_girl की तरह कुछ में देखना चाहते हो सकता है:

def test_... 
    Factory.create(:project, :current_release => 10.0) 
    assert !Factory.build(:project, :current_release => 1.0).valid? 
end 
:

http://github.com/thoughtbot/factory_girl

आपका इकाई परीक्षण तो कैसा लगेगा

4

रेल 3.2 के साथ, आप एक प्रो में गुजरकर फ्लाई पर एक दूसरे के खिलाफ दो फ़ील्ड मान्य कर सकते हैं।

validates_numericality_of :next_release, :greater_than => Proc.new {|project| project.current_release } 
6

validates_numericality_ofa large list of options स्वीकार करता है और उनमें से कुछ एक proc या एक प्रतीक के साथ आपूर्ति की जा सकती है (इसका मतलब है आप मूल रूप से एक विशेषता या एक पूरे विधि पारित कर सकते हैं)।

मान्य करने के लिए एक संपत्ति की numericality एक और मूल्य से अधिक है:

class Project < ActiveRecord::Base 
    validates_numericality_of :current_release, less_than: ->(project) { project.next_release } 

    validates_numericality_of :next_release, 
    greater_than: Proc.new { project.current_release } 
end 

स्पष्ट करने के लिए निम्न विकल्पों में से किसी एक proc या प्रतीक को स्वीकार कर सकते हैं:

  • :greater_than
  • :greater_than_or_equal_to
  • :equal_to :less_than
  • :less_than_or_equal_to

validates_numericality डॉक्स:http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of

सत्यापन के साथ procs प्रयोग: http://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless

संबंधित मुद्दे