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.

Author: thenengah, 2010-05-06

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])
 312
Author: Salil,
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.

 73
Author: Matt,
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.

 15
Author: Balachandar1887229,
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.

 11
Author: Kibet Yegon,
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")
 6
Author: Ziv Galili,
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ę.

 5
Author: Shoaib Malik,
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.

 4
Author: adamliesko,
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.

 3
Author: uma,
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

 2
Author: rogerdpack,
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)
 2
Author: Wojciech Bednarski,
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

 1
Author: concept47,
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