2011-10-07 37 views

Trả lời

25

Bạn đang tìm kiếm update_all. See doc.

Hãy coi chừng, không có cuộc gọi lại nào được kích hoạt theo cách này.

+0

Cảm ơn, đây là một cách hiệu quả hơn để thực hiện điều này hơn là lặp qua từng phần tử. – Ryan

+1

@Ryan nó hiệu quả hơn nhiều nhưng việc thiếu callback khiến cho nó trở nên khó khăn trong kinh nghiệm của tôi. Một trong những trường hợp sử dụng phổ biến nhất (ngoài dữ liệu dọn dẹp, vv trong phát triển) là các thực thể cho phép/vô hiệu hóa khối lượng. Thông thường, việc cập nhật dữ liệu như vậy đáng chú ý khi thông báo cho người dùng của bạn mà tôi thường thực hiện qua các cuộc gọi lại;) –

34

này nên làm việc

Notification.all.each do |n| n.update_attribute(:email, true); end 

chỉnh sửa: làm tùy chỉnh từ Bricker:

Notification.all.each { |n| n.update_attribute(:email, true) } 
+2

'Notification.all.each {| n | n.update_attribute (: email, true)} '- dấu chấm phẩy không thuộc về Ruby. ;) – bricker

+0

'Notification.all.each {| n | n.update_attribute: email, true} ' Không thực hiện thêm dấu ngoặc đơn. ;) (Và bạn cũng có thể sử dụng biểu mẫu 'do ... end' mà không có dấu chấm phẩy, bởi vì' end' là (gần như) không bao giờ mơ hồ: 'Notification.all.each do | n | n.update_attribute: email, true end' - nhưng không có cú pháp làm nổi bật điều này là ít có thể đọc được.) –

+1

Nếu bạn có nhiều hơn một tuyên bố bạn phải sử dụng dấu chấm phẩy, tôi chỉ quen với nó theo cách đó. – cbron

12

Bạn có thể sử dụng:

Notification.update_all(email: true) 

Nếu bạn có bất kỳ điều kiện cho việc cập nhật, bạn nên sử dụng :

Notification.find_each { |n| n.email = (n.id > 100) ? true : false } 

Sử dụng Something.all là ý tưởng tồi đối với bảng db lớn.

+0

Một số tham chiếu http://api.rubyonrails.org/classes/ActiveRecord/Batches.html – makhan

4
Notification.update_all(email: true) 

là câu trả lời cơ bản.

Bạn không phải "lặp lại" mỗi lần bằng cách viết khối của riêng bạn: bạn có thể cho phép bản ghi hoạt động thực hiện công việc khó khăn cho bạn - đây là ví dụ về nơi bạn có một mảng id và bạn muốn cập nhật email của họ (i về cơ bản mất ví dụ này trực tiếp từ một trong các bộ điều khiển của tôi):

@notifications = Notification.where(id: [1,2,3,2,1,2]).update_all(email: true) 

Edit: folks xem ra cho sql injection không bao gồm một params [: notification_ids] trong "ở đâu" phương pháp của bạn với một nguyên chuỗi mà không thoát hoặc bạn sẽ bị tấn công tiêm sql; hoặc được an toàn và sử dụng một băm.

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