Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Oba z nich zaktualizują obiekt bez konieczności jawnego informowania AR o aktualizacji.
Rails API mówi:
dla update_attribute
Aktualizuje pojedynczy atrybut i zapisuje rekord bez przechodzenia przez normalną procedurę sprawdzania poprawności. Jest to szczególnie przydatne w przypadku flag boolowskich w istniejących rekordach. Zwykła metoda update_attribute w Base jest zastępowana tą, gdy dodaje się moduł sprawdzania poprawności, co jest domyślnie.
dla update_attributes
Aktualizuje wszystkie atrybuty z przekazanego skrótu i zapisuje rekord. Jeśli obiekt jest nieprawidłowy, zapisywanie zakończy się niepowodzeniem, a false zostanie zwrócony.
Więc jeśli nie chcę, aby obiekt został sprawdzony, powinienem użyć update_attribute. Co się stanie, jeśli będę mieć tę aktualizację przed zapisaniem, czy zostanie ona przepełniona?
Moje pytanie brzmi, czy update_attribute omija również przed zapisaniem lub po prostu sprawdzanie poprawności.
Jaka jest poprawna składnia, aby przekazać skrót do update_attributes ... sprawdź mój przykład na górze.
źródło
update_attribute
oświadczenie wbefore_save
wywołaniu zwrotnym? Nie mogę wymyślić dobrego powodu.before_save
wywołania zwrotnego). Fe zamiastupdate_attribute(:discount, 0.1) if amount > 100
ciebie mógł zrobićdiscount = 0.1 if amount > 100
.update_attribute
wywołujesave
obiekt, co w tym przypadku nie jest konieczne, ponieważ instrukcja znajduje się wbefore_save
wywołaniu zwrotnym i zostanie zapisana. Mam nadzieję, że to ma sens.Odpowiedzi:
Proszę odnieść się do
update_attribute
. Po kliknięciu pokaż źródło otrzymasz następujący koda teraz polecaj
update_attributes
i spójrz na otrzymany kodróżnica między nimi to
update_attribute
zastosowania,save(false)
podczas gdyupdate_attributes
zastosowaniasave
lub można powiedziećsave(true)
.Przepraszam za długi opis, ale to, co chcę powiedzieć, jest ważne.
save(perform_validation = true)
, jeśliperform_validation
jest fałszem, pomija (pominięcie będzie właściwym słowem) wszystkie walidacje związane zsave
.Na drugie pytanie
Twój przykład jest poprawny.
lub
lub jeśli dostaniesz wszystkie pola danych i nazwę w haszu, powiedz
params[:user]
tutaj użyj justźródło
Rails 3
. W komentarzach w źródle jest napisane bardzo wyraźnie, że „wywoływane są wywołania zwrotne”.update_attributes
jest teraz aliasem dlaupdate
Wskazówka:
update_attribute
jest przestarzałe w Railsach 4 przez Commit a7f4b0a1 . Usuwaupdate_attribute
na korzyśćupdate_column
.źródło
update_attribute
pomija sprawdzanie poprawności, ale szanuje wywołania zwrotne,update_column
pomija sprawdzanie poprawności i wywołania zwrotne oraz nie aktualizuje:updated_at
,update
jest normalną funkcją, która będzie respektować zarówno wywołania zwrotne, jak i sprawdzanie poprawnościupdate_column
nie jest przestarzałe, aleupdate_columns(name: value)
jest uprzywilejowane.reset_column
zostało usunięte.update_attribute
Ta metoda aktualizuje pojedynczy atrybut obiektu bez wywoływania sprawdzania poprawności na podstawie modelu.
aktualizacja_atrybutów
Ta metoda aktualizuje wiele atrybutów pojedynczego obiektu, a także przekazuje sprawdzanie poprawności na podstawie modelu.
Mam nadzieję, że ta odpowiedź wyjaśni, kiedy użyć jakiej metody aktywnego zapisu.
źródło
Warto również zauważyć, że za pomocą
update_attribute
, żądany atrybut do aktualizacji nie musi znajdować się na białej liście,attr_accessible
aby go zaktualizować, w przeciwieństwie do metody przypisywania masy,update_attributes
która aktualizuje tylkoattr_accessible
określone atrybuty.źródło
update_attribute
po prostu aktualizuje tylko jeden atrybut modelu, ale możemy przekazać wiele atrybutówupdate_attributes
metodą.Przykład:
Przeszedł walidację
nie aktualizuje się, jeśli sprawdzanie poprawności się nie powiedzie.
źródło
Świetne odpowiedzi. zauważ, że jak w Ruby 1.9 i nowszych, możesz (i myślę, że powinien) użyć nowej składni skrótu dla update_attributes:
źródło
Możesz być zainteresowany odwiedzeniem tego postu na blogu, dotyczącym wszystkich możliwych sposobów przypisania atrybutu lub aktualizacji rekordu (zaktualizowanego do wersji Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Na przykład różni się aspektami, takimi jak uruchamianie sprawdzania poprawności, dotykanie obiektu updated_at obiektu lub wyzwalanie wywołań zwrotnych.Jako odpowiedź na pytanie PO
update_attribute
nie przekazuje oddzwaniania.źródło
update_attribute
iupdate_attributes
są podobne, ale z jedną dużą różnicą:update_attribute
nie przeprowadza walidacji.Również:
update_attribute
służy do aktualizacji rekordu za pomocą jednego atrybutu.update_attributes
służy do aktualizacji rekordu z wieloma atrybutami.Te dwie metody są naprawdę łatwe do pomylenia, biorąc pod uwagę ich podobne nazwy i prace. Dlatego
update_attribute
jest usuwany na korzyśćupdate_column
.Teraz w Rails4 możesz używać
Model.update_column(:column_name, column_value)
zamiastModel.update_attribute(:column_name, column_value)
Kliknij tutaj, aby uzyskać więcej informacji na temat
update_column
.źródło
Aby odpowiedzieć na twoje pytanie,
update_attribute
pomiń wcześniej „sprawdzanie poprawności”, ale nadal uruchamia inne wywołania zwrotne, takie jakafter_save
itp. Więc jeśli naprawdę chcesz „po prostu zaktualizować kolumnę i pominąć dowolne cruft AR”, musisz użyć (najwyraźniej)Model.update_all(...)
patrz https://stackoverflow.com/a/7243777/32453źródło
Ostatnio wpadłem na
update_attribute
vs.update_attributes
emisyjna walidacji, więc podobne nazwy, więc różne zachowania, więc mylące.Aby przekazać skrót
update_attribute
i pominąć sprawdzanie poprawności, możesz:źródło
Myślę, że twoje pytanie dotyczy tego, czy posiadanie atrybutu update_attave w zapisie before_save doprowadzi do niekończącej się pętli (wywołań update_attribute w wywołaniach zwrotnych before_save, pierwotnie wywołanych wywołaniem update_attribute)
Jestem prawie pewien, że omija wywołanie zwrotne before_save, ponieważ tak naprawdę nie zapisuje rekordu. Możesz także zapisać rekord bez uruchamiania sprawdzania poprawności za pomocą
Model.save false
źródło