2013-08-17 26 views
13

Có cách nào ngắn hơn cho điều này trong Rails 3 không?Sử dụng update_columns trong Rails 3?

user.update_column(:attribute1, value1) 
user.update_column(:attribute2, value2) 
user.update_column(:attribute3, value3) 
user.update_column(:attribute4, value4) 

tôi đã cố gắng update_columns nhưng nó chỉ có trong Rails 4.

Cảm ơn sự giúp đỡ nào.

+3

Để rõ ràng, câu hỏi này không đề cập đến thời gian gọi lại hoặc không gọi lại. Làm rõ là cần thiết, cho đến khi đó nó an toàn để giả định callbacks không muốn. –

+0

Bạn đã đặt câu hỏi không thể trả lời mà không làm rõ. Sau đó, bạn không làm rõ khi được hỏi về callbacks. Không cố gắng để âm thanh thô lỗ nhưng hãy hiểu khi mọi người đang cố gắng để giúp đỡ, bạn nên theo dõi. – drhenner

Trả lời

28

Dưới đây là một cách giải quyết cho Rails 3.x:

User.where(id: user.id).update_all(attribute1: value1, attribute2: value2, ...) 
0

Nếu bạn cần tốc độ mà bạn cũng có thể gọi thực hiện trực tiếp trên kết nối AR. Tôi đã sử dụng một cái gì đó như thế này để nhập một lượng lớn dữ liệu.

connection = ActiveRecord::Base.connection 
email = connection.quote(email) 
zip = connection.quote(zip) 
connection.execute(%{UPDATE "users" SET "email" = #{email}, "zip" = #{zip} WHERE "users"."id" = #{user.id}}) 

Lưu ý rằng xác thực và gọi lại sẽ không được chạy.

0

cách tiếp cận khác, bạn có thể mất mà hoàn thành được điều tương tự là thế này:

user.assign_attributes(
    first_name: 'foo', 
    last_name: 'bar' 
) 

user.save(validate: false) 

LƯU Ý: Bạn không cần phải sử dụng validate sai. Tuy nhiên, phương thứC#update_column bỏ qua các xác thực và các cuộc gọi lại. Vì vậy, nếu đó là những gì bạn đang tìm kiếm, sử dụng xác nhận sai.