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)
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)
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)
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
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'. –
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 –
Możesz użyć 'Comment.update_all (" test = NULL "," test nie jest pusty ")' zamiast – bor1s
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