বৈধতা ছাড়াই কীভাবে বৈশিষ্ট্যগুলি আপডেট করবেন


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

আপডেট_অ্যাট্রিবিউটের পরিবর্তে ব্যবহার করুন আপডেট_ট্রিবিউট

একটি একক অ্যাট্রিবিউট আপডেট করে এবং সাধারণ বৈধকরণ প্রক্রিয়া ছাড়াই রেকর্ডটি সংরক্ষণ করে।

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

দ্রষ্টব্য: - 'আপডেট_ট্রিবিউট' প্রশ্নের উত্তর দেওয়া কোড থেকে একবারে কেবলমাত্র একটি বৈশিষ্ট্য আপডেট করুন আমি মনে করি এটি আপনার জন্য কাজ করবে।


9
আপনি বৈধতা ছাড়াই সেভ (ভুয়া) ব্যবহার করতে পারেন
ডিজিট্রি

31
update_attributeরেল 4, এফওয়াইআইয়ে অবহিত করা হয়েছে। A.attributes ({...}) ব্যবহার করে দেখুন পরিবর্তে সংরক্ষণ করুন (মিথ্যা)। বা যদি আপনি কলব্যাকগুলি চালানোর (বা চান) যত্ন না করেন তবে চেকআউট করুন update_column
জোশুয়া পিন্টার

27
রেল 4 এর জন্য, save(false)কাজ করে না, আপনি অবশ্যই ব্যবহার করুনsave(validate: false)
টোবিয়াস কোহেন

7
@ জোশপিন্টার এইচএম, update_attribute4.2 টি কারাগারে অবহেলিত বলে মনে হচ্ছে না (এটির মতো নামকরণ করা হয়েছে update_column): api.rubyonrails.org/classes/AtivetiveRecord/…
টোনি ডি

3
@ TončiD। বাহ, আপনি একেবারে সঠিক। দেখে মনে হচ্ছে যে তারা এটিকে 3.2-এ অবমূল্যায়ন এবং 4.0 এ অপসারণ করার পরিকল্পনা করেছিল কিন্তু তারপরে সিদ্ধান্ত বদলানোর সিদ্ধান্ত নেয় যেহেতু এটি বিনিময়যোগ্য নয় update_column। দুই বছরে অনেক কিছু বদলাতে পারে! :) এটা ইশারা জন্য ধন্যবাদ. এটি সম্পর্কে এখানে আরও পড়ুন: groups.google.com/forum/?hl=en&fromgroups#!topic/…
জোশুয়া পিন্টার

185

আপনি যেমন কিছু করতে পারেন:

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

13
প্রকৃতপক্ষে এটির অবজেক্টটি সংরক্ষণ করুন: (বৈধতা => মিথ্যা)
কেন মজাইকা

1
হাঁ। অবজেক্ট.স্যাভ (: বৈধতা => মিথ্যা) আমার পক্ষে কাজ করে। ইঙ্গিতটির জন্য অনেক ধন্যবাদ!
রবার্ট রেইজ

1
object.attributes = hashপ্রশ্নের সাথে সামঞ্জস্য রেখে আরও কিছুটা। যদি কেউ আশ্চর্য update_attributes(hash)হয় তবে তা কেবল নিখুঁত করে self.attributes = hash; save
লোয়েকি

1
অবজেক্ট.স্যাভ (ভুয়া) রেলগুলি 2 এবং নীচে ব্যবহার করা হলে সেগুলি কার্যকর হবে
স্টিভেনস্পিল

এটি আরও ভাল কারণ এটি টাইমস্ট্যাম্পগুলি আপডেট করে এমন কলব্যাকগুলি সম্পাদন করবে। অপটিতে বিশেষত সমস্ত কলব্যাক নয়, বৈধতা এড়ানো উল্লেখ করা হয়েছে।
সানেশার্ক

79

ব্যবহার করার চেষ্টা করুন

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

আমার জন্য কাজ কর


3
এটি রেল 4 এর সাথে বৈধ উত্তর, বর্তমানে গৃহীত উত্তরের সমস্ত মন্তব্যের সংমিশ্রণ।
টুবুলকেহে

33

আপনি ব্যবহার করতে পারেন:

a.update_column :state, a.state

চেক করুন: http://apidock.com/rails/AtivetiveRecord/Persistance/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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.