2010-06-08 23 views
82

Tôi đã có một mô hình với các xác thực 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 đó.Cách cập nhật các thuộc tính mà không cần xác nhận

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

mô hình thông báo của tôi có kiểm chứng thực sau đây:

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 My nào sau đây:

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 

này ném tất cả các trường hợp ngoại lệ xác nhận cho mô hình đó, ở đầu ra.

Có ai cập nhật thuộc tính mà không xác thực mô hình không?

Trả lời

121

SỬ DỤNG update_attribute thay vì update_attributes

Cập nhật một thuộc tính duy nhất và tiết kiệm kỷ lục mà không cần phải trải qua các thủ tục xác nhận bình thường.

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

Lưu ý: 'update_attribute' chỉ cập nhật một thuộc tính từ mã được đưa ra trong câu hỏi mà tôi nghĩ nó sẽ phù hợp với bạn.

+0

này làm việc! Cảm ơn bạn. Tôi sẽ đánh dấu câu trả lời này ngay sau khi tôi có thể làm được. –

+8

Bạn có thể sử dụng lưu (false) mà không cần xác nhận – Dzmitry

+1

Hmm, nhưng có cách nào phân tích cú pháp các tham số [: instance] như update_attributes không? – Dogweather

-1

nên không có được

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

vì vậy nó chỉ công trình trong quá trình tạo ra?

+0

OP cho biết: 'Tôi đã cố gắng thêm vào =>: tạo cú pháp tại cuối mỗi dòng xác nhận, nhưng tôi có cùng kết quả.' – iwasrobbed

138

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

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

thực sự đối tượng của nó.save (: validate => false) –

+1

Đúng. object.save (: validate => false) hoạt động cho tôi. Rất cám ơn vì gợi ý! –

+1

'object.attributes = hash' hơi phù hợp với câu hỏi. Nếu bất cứ ai thắc mắc, 'update_attributes (băm)' chỉ đơn thuần là 'self.attributes = hash; save'. – Lloeki

18

Yo có thể sử dụng:

a.update_column :state, a.state 

Kiểm tra: http://apidock.com/rails/ActiveRecord/Persistence/update_column

Cập nhật một thuộc tính duy nhất của một đối tượng, mà không gọi tiết kiệm.

+3

Đây là cách tiếp cận tốt nhất nếu bạn muốn bỏ qua cả hai xác thực và gọi lại. Ngoài ra còn có 'update_columns' nếu bạn đang tìm cách cập nhật nhiều thuộc tính. –

46

hãy thử sử dụng

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

công trình đối với tôi

+1

đâ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 nhận xét cho câu trả lời hiện được chấp nhận. – toobulkeh

3

Tất cả cá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) 
+0

Chính xác những gì tôi cần. Cảm ơn bạn loại Sir! –

Các vấn đề liên quan