2011-06-28 24 views
6

Tôi có danh sách các nhận xét trong một mảng. Tôi có thể sử dụng update_all trên mảng không?Tôi có thể sử dụng update_all trên mảng không?

comments = Comments.find(:all,:conditions => ["test is not null"]) 

comments.update_all(:test => nil) 
+2

Bạn có thể sử dụng 'Comments.update_all (" test = NULL "," test is not null ")' thay vì – bor1s

+3

Hãy để tôi hỏi điều này thực sự nhanh chóng - bạn đã thử chưa? Rails console là một công cụ tuyệt vời để thử loại điều này. – pcg79

Trả lời

9

Bạn có thể nếu bạn làm việc với phạm vi (find hoặc all -in phiên bản cũ của Rails- trả lại một mảng):

comments = Comments.scoped(:conditions => "test IS NOT NULL") 
comments.update_all(:test => nil) 

Mở phiên bản hiện đại của Ruby/ActiveRecord bạn có thể viết:

Comments.where.not(test: nil).update_all(test: nil) 
3

update_all là một phương pháp được cung cấp bởi ActiveRecord, và những gì bạn có là một mảng, bạn có hai lựa chọn hoặc là sử dụng ActiveRecord qua Nhận xét (sẽ cập nhật cơ sở dữ liệu) hay bản đồ mảng, chỉ thay đổi objets trong bộ nhớ và không sửa đổi cơ sở dữ liệu:

comments = Comments.update_all({:test => nil}, 'test IS NOT NULL') 

hoặc

comments = Comments.find(:all,:conditions => ["test is not null"]) 
comments.map! { |c| c.test = nil unless c.test} 

EDIT: Lỗi trong ví dụ thứ hai, là c.test không c

+0

Ví dụ thứ hai của bạn không thực sự lưu các thay đổi vào cơ sở dữ liệu (nó sẽ cần một 'c.save' hoặc cái gì đó), và bạn đang thiết lập toàn bộ chú thích thành' nil', không chỉ 'c.test'. –

+0

Tôi đã khắc phục sự cố với cài đặt toàn bộ nhận xét, về việc không lưu các thay đổi trong cơ sở dữ liệu, nó đã có trong câu trả lời của tôi, câu hỏi không nói rằng các thay đổi có được áp dụng cho cơ sở dữ liệu hay không mảng ... đó là lý do tại sao tôi đưa ra hai giải pháp –

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