Rails: update atrybut vs update atrybuty
Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Obie z nich zaktualizują obiekt bez konieczności jawnego nakazywania AR aktualizacji.
Rails API says:
Dla update_attribute
Aktualizuje pojedynczy atrybut i zapisuje rekord bez przechodzenia przez normalną procedurę walidacji. Jest to szczególnie przydatne dla FLAG logicznych w istniejących rekordach. Zwykła metoda update_attribute w Base jest zastępowana tą, gdy moduł walidacji jest mieszany, co jest default.
Dla update_attributes
Aktualizuje wszystkie atrybuty z przekazanego Hasha i zapisuje rekord. Jeśli obiekt jest nieprawidłowy, zapisanie nie powiedzie się i zostanie zwrócone false.
Więc jeśli nie chcę mieć walidacji obiektu powinienem użyć update_attribute. Co jeśli mam tę aktualizację na before_save, czy będzie ona stackoverflow?
Moje pytanie brzmi, czy update_attribute również omija przed save lub po prostu / align = "left" /
Ponadto, jaka jest poprawna składnia przekazywania hasha do update_attributes... zobacz mój przykład na górze.
11 answers
Proszę odnieść się do update_attribute
. Po kliknięciu Pokaż źródło otrzymasz następujący kod
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614: def update_attribute(name, value)
2615: send(name.to_s + '=', value)
2616: save(false)
2617: end
A teraz referat update_attributes
i spójrz na jego kod dostajesz
# File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621: def update_attributes(attributes)
2622: self.attributes = attributes
2623: save
2624: end
Różnica między dwoma jest update_attribute
zastosowania save(false)
a także mając na uwadze update_attributes
zastosowania save
albo możesz powiedzieć save(true)
.
Przepraszam za długi opis, ale to co chcę powiedzieć jest ważne. save(perform_validation = true)
, Jeśli perform_validation
jest false to omija (przeskakuje być właściwym słowem) wszystkie walidacje związane z save
.
Na drugie pytanie
Ponadto, jaka jest poprawna składnia przekazywania hasha do update_attributes... zobacz mój przykład na górze.
Twój przykład jest poprawny.
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Lub
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
Lub jeśli masz wszystkie pola Dane i nazwa w hash powiedz params[:user]
tutaj użyj tylko
Object.update_attributes(params[:user])
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 21:50:22
Tip: update_attribute
jest przestarzały w Rails 4 Poprzez Commit a7f4b0a1. Usuwa update_attribute
Na Rzecz update_column
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 13:11:14
update_attribute
Ta metoda aktualizuje pojedynczy atrybut obiektu bez wywoływania walidacji opartej na modelu.
obj = Model.find_by_id(params[:id])
obj.update_attribute :language, “java”
update_attributes
Ta metoda aktualizuje wiele atrybutów pojedynczego obiektu, a także przekazuje walidację opartą na modelu.
attributes = {:name => “BalaChandar”, :age => 23}
obj = Model.find_by_id(params[:id])
obj.update_attributes(attributes)
Mam nadzieję, że ta odpowiedź wyjaśni, kiedy użyć jakiej metody active record.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 11:10:01
Warto również zauważyć, że z update_attribute
, pożądany atrybut do aktualizacji nie musi być na białej liście z attr_accessible
, aby go zaktualizować, w przeciwieństwie do metody przypisywania masy update_attributes
, która aktualizuje tylko attr_accessible
określone atrybuty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-09 07:32:17
Świetne odpowiedzi. zauważ, że jeśli chodzi o ruby 1.9 i wyżej, Możesz (i myślę, że powinieneś) użyć nowej składni hash dla update_attributes:
Model.update_attributes(column1: "data", column2: "data")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 09:28:19
update_attribute
po prostu aktualizuje tylko jeden atrybut modelu, ale możemy przekazać wiele atrybutów w metodzie update_attributes
.
Przykład:
user = User.last
#update_attribute
user.update_attribute(:status, "active")
Przechodzi walidację
#update_attributes
user.update_attributes(first_name: 'update name', status: "active")
Nie aktualizuje się, jeśli Walidacja nie powiedzie się.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 10:19:59
Możesz być zainteresowany odwiedzeniem tego wpisu na blogu dotyczącego wszystkich możliwych sposobów przypisania atrybutu lub rekordu aktualizacji (zaktualizowanego do Rails 4) update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord / . na przykład różni się w takich aspektach, jak uruchamianie walidacji, dotykanie obiektu updated_at lub wyzwalanie wywołań zwrotnych.
Jako odpowiedź na pytanie OP update_attribute
nie przepuszcza wywołań zwrotnych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 10:45:40
update_attribute
i update_attributes
są podobne, ale
z jedną wielką różnicą: update_attribute
nie uruchamia walidacji.
Także:
-
update_attribute
jest używany do aktualizacji rekordu atrybutem single .Model.update_attribute(:column_name, column_value1)
-
update_attributes
jest używany do aktualizacji rekordu z wieloma atrybutami .Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...)
Te dwie metody są naprawdę łatwe do zmylenia, biorąc pod uwagę ich podobne nazwy i prace. Dlatego update_attribute
jest usuwany na rzecz update_column
.
Teraz w Rails4 możesz użyć Model.update_column(:column_name, column_value)
w miejscu Model.update_attribute(:column_name, column_value)
Kliknij tutaj {[40] } aby uzyskać więcej informacji o update_column
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-13 15:23:21
Aby odpowiedzieć na twoje pytanie, update_attribute pomija wstępne zapisywanie "walidacji", ale nadal uruchamia wszelkie inne wywołania zwrotne, takie jak after_save
itp. Więc jeśli naprawdę chcesz "po prostu zaktualizować kolumnę i pominąć dowolny AR cruft", musisz użyć (najwyraźniej)
Model.update_all(...)
Zobacz https://stackoverflow.com/a/7243777/32453
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:10
Ostatnio natknąłem się na update_attribute
vs. update_attributes
i problem z walidacją, tak podobne nazwy, tak różne zachowania, tak mylące.
Aby przekazać hash do update_attribute
i obejść walidację możesz zrobić:
object = Object.new
object.attributes = {
field1: 'value',
field2: 'value2',
field3: 'value3'
}
object.save!(validate: false)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 06:18:02
Myślę, że twoje pytanie brzmi, czy posiadanie update_attribute w before_save doprowadzi do nieskończonej pętli (wywołań update_attribute w before_save wywołania, pierwotnie wywołane przez update_attribute wywołania)
Jestem prawie pewien, że omija wywołanie zwrotne before_save, ponieważ nie zapisuje rekordu. Można również zapisać rekord bez uruchamiania walidacji za pomocą
Model.Zapisz false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 05:39:14