Cách cập nhật thuộc tính mà không cần xác nhận


131

Tôi đã có một mô hình với các xác nhận hợp lệ của nó và tôi phát hiện ra rằng tôi không thể cập nhật một thuộc tính mà không xác thực đối tượng trước đó.

Tôi đã cố gắng thêm on => :createcú pháp vào cuối mỗi dòng xác nhận, nhưng tôi đã nhận được kết quả tương tự.

Mô hình thông báo của tôi có các xác nhận sau:

  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

Nhiệm vụ cào của tôi làm như sau:

  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

Điều này ném tất cả các ngoại lệ xác nhận cho mô hình đó, trong đầu ra.

Có ai làm thế nào để cập nhật một thuộc tính mà không xác nhận mô hình?

Câu trả lời:


176

USE update_attribution thay vì update_attribut

Cập nhật một thuộc tính duy nhất và lưu bản ghi mà không cần thông qua quy trình xác nhận thông thường.

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

Lưu ý: - 'update_attribution' chỉ cập nhật một thuộc tính tại mã được nêu trong câu hỏi tôi nghĩ rằng nó sẽ hoạt động cho bạn.


9
Bạn có thể sử dụng lưu (sai) mà không cần xác thực
Dzmitry

31
update_attributekhông được dùng trong Rails 4, FYI. Thay vào đó, hãy thử sử dụng a.attribut ({...}). Save (false). Hoặc nếu bạn không quan tâm (hoặc muốn) các cuộc gọi lại được chạy, hãy kiểm tra update_column.
Joshua Pinter

27
Đối với Rails 4, save(false)không hoạt động, bạn phải sử dụngsave(validate: false)
Tobias Cohen

7
@JoshPinter Hm, update_attributedường như không được tán thành trong Rails 4.2 (nó là aliased như update_column): api.rubyonrails.org/classes/ActiveRecord/...
Tonči D.

3
@ TončiD. Wow, bạn hoàn toàn chính xác. Có vẻ như họ có ý định loại bỏ nó trong 3.2 và loại bỏ nó trong 4.0 nhưng sau đó quyết định đảo ngược quyết định của họ vì nó không thể thay thế cho nhau update_column. Rất nhiều có thể thay đổi trong hai năm! :) Cảm ơn đã chỉ ra điều đó. Đọc thêm về nó ở đây: Groups.google.com.vn/forum/?hl=vi&fromgroups#!topic/iêu
Joshua Pinter

185

Bạn có thể làm một cái gì đó như:

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

13
thực sự là object.save (: verifyate => false)
Ken Mazaika

1
Vâng. object.save (: validate => false) hoạt động với tôi. Rất cám ơn cho gợi ý!
Robert Reiz

1
object.attributes = hashlà một chút phù hợp với câu hỏi. Nếu bất cứ ai tự hỏi, update_attributes(hash)chính nó chỉ làm self.attributes = hash; save.
Lloeki

1
object.save (false) là tất cả những gì sẽ hoạt động nếu sử dụng Rails 2 trở xuống
stevenspiel

Điều này tốt hơn bởi vì nó vẫn sẽ thực hiện các cuộc gọi lại cập nhật dấu thời gian. Các op đặc biệt đề cập đến việc tránh xác nhận, không phải TẤT CẢ các cuộc gọi lại.
saneshark

79

thử sử dụng

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

làm việc cho tôi


3
đây là câu trả lời hợp lệ với Rails 4, một sự kết hợp của tất cả các ý kiến ​​cho câu trả lời hiện được chấp nhận.
toobulkeh


7

Tất cả xác nhận từ mô hình được bỏ qua khi chúng tôi sử dụng validate: false

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

Chính xác những gì tôi cần. Xin cảm ơn ngài!
Ajunpreet Bambrah

-1

Không nên như vậy

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

Vì vậy, nó chỉ hoạt động trong khi tạo?


OP cho biết:I already tried to add on => :create syntax at the end of each validation line, but I got the same results.
iwasrobbed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.