सत्यापन के बिना विशेषताओं को कैसे अपडेट किया जाए


132

मुझे इसकी मान्यताओं के साथ एक मॉडल मिला है, और मुझे पता चला है कि मैं पहले ऑब्जेक्ट को मान्य किए बिना एक विशेषता को अपडेट नहीं कर सकता।

मैंने पहले से ही on => :createप्रत्येक सत्यापन लाइन के अंत में सिंटैक्स जोड़ने की कोशिश की , लेकिन मुझे वही परिणाम मिले।

मेरे घोषणा मॉडल में निम्नलिखित मान्यताएँ हैं:

  validates_presence_of :title
  validates_presence_of :description
  validates_presence_of :announcement_type_id

  validate :validates_publication_date
  validate :validates_start_date
  validate :validates_start_end_dates
  validate :validates_category
  validate :validates_province

  validates_length_of :title, :in => 6..255, :on => :save
  validates_length_of :subtitle, :in => 0..255, :on => :save
  validates_length_of :subtitle, :in => 0..255, :on => :save
  validates_length_of :place, :in => 0..50, :on => :save

  validates_numericality_of :vacants, :greater_than_or_equal_to => 0,  :only_integer => true
  validates_numericality_of :price, :greater_than_or_equal_to => 0,  :only_integer => true

मेरा रेक कार्य निम्नलिखित है:

  task :announcements_expiration => :environment do
    announcements = Announcement.expired

    announcements.each do |a|
      #Gets the user that owns the announcement
      user = User.find(a.user_id)
      puts a.title + '...'

      a.state = 'deactivated'

      if a.update_attributes(:state => a.state)
        puts 'state changed to deactivated'
      else
        a.errors.each do |e|
          puts e
        end

      end
    end

यह आउटपुट में उस मॉडल के सभी सत्यापन अपवादों को फेंकता है।

क्या कोई भी मॉडल को मान्य किए बिना किसी विशेषता को कैसे अपडेट कर सकता है?

जवाबों:


177

उपयोग update_attribute के बजाय update_attributes

एकल विशेषता को अद्यतन करता है और सामान्य सत्यापन प्रक्रिया से गुजरे बिना रिकॉर्ड को बचाता है।

if a.update_attribute('state', a.state)

नोट: - 'update_attribute' अद्यतन केवल एक विशेषता को प्रश्न में दिए गए कोड से एक बार में लगता है कि मुझे लगता है कि यह आपके लिए काम करेगा।


9
आप बिना मान्यता के सेव (झूठा) का उपयोग कर सकते हैं
Dzmitry

31
update_attributeरेल 4, FYI में पदावनत किया जाता है। इसके बजाय a.attributes ({...}) को बचाने का प्रयास करें। या अगर आपको परवाह नहीं है (या चाहते हैं) कॉलबैक चलाया जाए, चेकआउट किया जाए update_column
जोशुआ पिंटर

27
रेल 4 के लिए, save(false)काम नहीं करता है, आपको save(validate: false)
टोबीस कोहेन

7
@ जोश पिंटर ह्म, update_attributeरेल 4.2 में पदावनत प्रतीत नहीं होता (यह इस प्रकार है update_column): api.rubyonrails.org/classes/ActiveRecord/…
Tonči

3
@ TončiD। वाह, आप बिल्कुल सही हैं। ऐसा लगता है कि उन्होंने 3.2 में इसे अपदस्थ करने और 4.0 में इसे हटाने का इरादा किया था, लेकिन इसके बाद अपने निर्णय को उलटने का फैसला किया क्योंकि इसके साथ इंटरचेंज नहीं किया गया था update_column। दो साल में बहुत कुछ बदल सकता है! :) इस पर ध्यान दिलाने के लिए धन्यवाद। इसके बारे में अधिक यहाँ पढ़ें: group.google.com/forum/?hl=en&fromgroups# .topic/…
जोशुआ पिंटर

185

आप कुछ ऐसा कर सकते हैं:

object.attribute = value
object.save(:validate => false)

13
वास्तव में इसकी वस्तु.सेव (: मान्य => असत्य)
केन माज़िका

1
हां। object.save (: validate => false) मेरे लिए काम करता है। संकेत के लिए बहुत धन्यवाद!
रॉबर्ट रीज़

1
object.attributes = hashसवाल के साथ थोड़ा और अधिक है। यदि कोई आश्चर्य करता है, तो वह update_attributes(hash)केवल करता है self.attributes = hash; save
लोईकी

1
object.save (झूठा) वह सब है जो अगर 2 और उससे नीचे की
रैलियों

यह बेहतर है क्योंकि यह अभी भी कॉलबैक को निष्पादित करेगा जो टाइमस्टैम्प को अपडेट करता है। ऑप विशेष रूप से सत्यापन से बचने का उल्लेख करता है, सभी कॉलबैक नहीं।
संस्कार

79

प्रयोग करके देखें

@record.assign_attributes({ ... })
@record.save(validate: false)

मेरे लिये कार्य करता है


3
यह रेल 4 के साथ मान्य उत्तर है, वर्तमान में स्वीकृत उत्तर के लिए सभी टिप्पणियों का एक संयोजन है।
तोबुलकेह

33

यो उपयोग कर सकते हैं:

a.update_column :state, a.state

जाँच करें: http://apidock.com/rails/ActiveRecord/Persistence/update_column

कॉल को सहेजे बिना किसी ऑब्जेक्ट की एकल विशेषता को अद्यतन करता है।


6
यदि आप सत्यापन और कॉलबैक दोनों को छोड़ना चाहते हैं तो यह सबसे अच्छा तरीका है। update_columnsयदि आप कई विशेषताओं को अपडेट करना चाहते हैं, तो भी है ।
ज़ैक कोलोन

7

जब हम उपयोग करते हैं तब मॉडल से सभी सत्यापन छोड़ दिए जाते हैं validate: false

user = User.new(....)
user.save(validate: false)

बिल्कुल वही जो मुझे चाहिए था। आप दयालु हैं शुक्रिया!
अजुनप्रीत बंभर

-1

ऐसा नहीं होना चाहिए

validates_length_of :title, :in => 6..255, :on => :create

तो यह केवल बनाने के दौरान काम करता है?


ओपी ने कहा:I already tried to add on => :create syntax at the end of each validation line, but I got the same results.
iwasrobbed
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.