Doğrulama olmadan özellikler nasıl güncellenir?


132

Doğrulamaları olan bir modelim var ve daha önce nesneyi doğrulamadan bir özniteliği güncelleyemeyeceğimi öğrendim.

Zaten on => :createher doğrulama satırının sonuna sözdizimi eklemeye çalıştım , ancak aynı sonuçları aldım.

Duyuru modelim aşağıdaki doğrulamalara sahip:

  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

Tırmık görevim şunları yapar:

  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

Bu, o model için tüm doğrulama istisnalarını çıktıda atar.

Modeli doğrulamadan bir özniteliğin nasıl güncelleneceği var mı?

Yanıtlar:


177

Update_attributes yerine update_attribute KULLANIN

Tek bir özelliği günceller ve normal doğrulama prosedüründen geçmeden kaydı kaydeder.

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

Not: - 'update_attribute', soruda verilen koddan bir seferde yalnızca bir özniteliği günceller, bunun sizin için çalışacağını düşünüyorum.


9
Kaydet (yanlış) 'ı doğrulama olmadan kullanabilirsiniz
Dzmitry

31
update_attributeFYI, Rails 4'te kullanımdan kaldırılmıştır. Öznitelikleri ({...}) kullanmayı deneyin. Onun yerine kaydedin (yanlış). Veya geri aramaların yapılmasını önemsemiyorsanız (veya istemiyorsanız), ödeme yapın update_column.
Joshua Pinter

27
Rails 4 save(false)için çalışmaz, kullanmanız gerekirsave(validate: false)
Tobias Cohen

7
@JoshPinter Hımm, update_attributeRaylar 4,2 (o kadar, diğer ad olarak kaldırılacaktır görünmüyor update_column:) api.rubyonrails.org/classes/ActiveRecord/...
Tonči D.

3
@ TončiD. Vay canına, kesinlikle haklısın. Görünüşe göre 3.2'de kullanımdan kaldırmayı ve 4.0'da kaldırmayı planlamışlar, ancak daha sonra kararlarını değiştirilemediği için geri almaya karar vermişler update_column. İki yılda çok şey değişebilir! :) Gösterdiğiniz için teşekkürler. Bununla ilgili daha fazla bilgiyi buradan okuyun: groups.google.com/forum/?hl=tr&fromgroups#!topic/…
Joshua Pinter

185

Şunun gibi bir şey yapabilirsiniz:

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

13
aslında object.save (: validate => false)
Ken Mazaika

1
Evet. object.save (: validate => false) benim için çalışıyor. İpucu için çok teşekkürler!
Robert Reiz

1
object.attributes = hashsoru ile biraz daha uyumlu. Biri merak ederse, update_attributes(hash)sadece kendisi yapar self.attributes = hash; save.
Lloeki

1
object.save (false), Rails 2 ve altı kullanılıyorsa işe yarayacaktır
stevenspiel

Bu daha iyidir, çünkü zaman damgalarını güncelleyen geri aramaları yürütmeye devam eder. Operasyon özellikle doğrulamalardan kaçınmaktan bahseder, TÜM geri aramalardan değil.
saneshark

79

kullanmayı dene

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

benim için çalışıyor


3
bu, şu anda kabul edilen cevaba yapılan tüm yorumların bir kombinasyonu olan Rails 4 ile geçerli cevaptır.
toobulkeh


7

Modelden tüm doğrulama, kullandığımızda atlanır validate: false

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

Tam olarak ihtiyacım olan şey. Teşekkürler nazik efendim!
Ajunpreet Bambrah

-1

Öyle olmamalı

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

yani yalnızca oluşturma sırasında çalışır?


OP dedi ki:I already tried to add on => :create syntax at the end of each validation line, but I got the same results.
01'de iwasrobbed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.