2011-06-28 13 views
6

Mam listę komentarzy w jednej tablicy. Czy mogę użyć update_all w tablicy?Czy mogę użyć update_all w tablicy?

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

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

Możesz użyć 'Comment.update_all (" test = NULL "," test nie jest pusty ")' zamiast – bor1s

+3

Pozwól, że zapytam to naprawdę szybko - czy próbowałeś? Konsola Rails jest doskonałym narzędziem do wypróbowywania tego typu rzeczy. – pcg79

Odpowiedz

9

Można, jeśli pracujesz z zakresów (find lub all -in starsza wersja Rails- zwróconych tablicę):

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

na nowoczesnej wersji Ruby/ActiveRecord można napisać:

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

update_all to metoda dostarczana przez ActiveRecord, a co masz jest tablicą, masz dwie opcje albo użyć ActiveRecord przez Komentarze (zaktualizuje bazę danych) lub map tablicę, zmieniając tylko objets w pamięci i nie modyfikacji bazy danych:

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

lub

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

Edycja: błąd w drugim przykładzie nie jest c.test C

+0

Twój drugi przykład tak naprawdę nie zapisuje zmian w bazie danych (potrzebowałby 'c.save' lub czegoś podobnego) i ustawiasz cały komentarz na' nil', a nie tylko na 'c.test'. –

+0

Naprawiłem problem z ustawianiem całego komentarza, o nie zapisywaniu zmian w bazie danych, był już w tekście mojej odpowiedzi, pytanie nie mówi, czy zmiany mają być zastosowane do bazy danych, czy tylko do array ... to dlatego podałem dwa rozwiązania –

Powiązane problemy