Czemu są różnice w nazewnictwie hashy

Witam
Dopiero zaczynam się uczyć Ruby on Rails i moje pytanie dotyczy różnic w nazewnictwie hashy.
Jeden z przykładów to gdy chcę zrobic update jakiegos zapisu w tabeli bazy danych uzywam metody update_attribute i podaję argumenty w postaci hasha:
Post.update_attribute(:title, "Nowy tytul")
Natomiast jesli chcę wywołać kilka argumentów, czyli zrobic kilka aktualizacji dla kolumn to wpisuję:
Post.update_attributes(title: "Nowy tytul", body: "nowy text")
Pogubiłem sie już całkiem, gdy doszedłem do metody order i argumenty podane jako hash są w postaci takiej jak w Ruby:
Post.order(:title => :desc)
Pytanie… czemu tak wiele różnych zapisow jest w rails, czym one się różnią, dlaczego one się tak różnią :slight_smile:
i czy jest gdzies jakiś materiał w którym mogę o tym poczytać? szukałem w dokumentacji, ale nie znalazłem…

Garść linków.


To tak żeby było od czego zacząć :wink: Ludzie z większą wiedzą pewnie napiszą więcej :slight_smile:

1 Like

tutaj nie podajesz hasha
http://apidock.com/rails/ActiveRecord/Persistence/update_attribute

1 Like

ok czyli po prostu muszę trzymać się dokumentacji i nie ma na to jakiejś konkretnej reguły bez zaglądania do dokumentacji?

Ta metoda przyjmuje dwa argumenty a nie hash argumentów. Nie każda metoda jak widać na powyższym przykładnie ma przekazywanie argumentów w postaci hasha. Dlatego niektóre gemy, frameworki tworzą dokumentacji żeby developerzy wiedzieli jakie argumenty mają przekazać.

1 Like
[1] pry(main)> { :foo => :bar } == { foo: :bar }
=> true

Druga notacja została wprowadona w wersji 1.9, jeżeli używasz Rubiego 1.9 lub nowszego to obojętnie którą stosujesz, zawsze dostaniesz w rezultacie Hasha.

Z Twojego przykładu zamiast Post.order(:title => :desc) można z powodzeniem użyć Post.order(title: :desc)

Preferowana jest ta nowsza:
{ foo: :bar }

1 Like

Bardzo dziękuję za odpowiedzi, sporo mi to wyjaśniło.

Warto dodać że ta nowsza to taki cukier na przypadek kiedy kluczem jest symbol. W hashu jednak klucz może być czymkolwiek, jednak wtedy należy stosować właśnie starą składnię. Przykłady:

{ "foo" => "bar" }
{ Constant => "bar" }
{ 1 => "bar" }