Mam następujący obiekt, który został utworzony
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Po zapisaniu chcę mieć możliwość przywrócenia obiektu do skrótu, np. Wykonując coś takiego:
@object.to_hash
Jak to możliwe z poziomu szyn?
ruby-on-rails
ruby
ben morgan
źródło
źródło
.to_json
joins
iselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
powróci{ street: "", name: "" }
as_json
, wywoła on,serializable_hash
który z kolei zadzwoniattributes
! Więc twoja rada polega na dodaniu dwóch warstw złożonościattributes
, co czyni go jeszcze droższym..as_json
zserializuje obiekt do ruby hashW najnowszej wersji Railsów (nie można jednak powiedzieć, która dokładnie), możesz użyć
as_json
metody:Wyświetli:
Aby przejść dalej, możesz zastąpić tę metodę, aby dostosować sposób wyświetlania atrybutów, wykonując coś takiego:
Następnie, w tym samym wystąpieniu, co powyżej, wyświetli:
Oznacza to oczywiście, że musisz wyraźnie określić, które atrybuty muszą się pojawić.
Mam nadzieję że to pomoże.
EDYTOWAĆ :
Możesz również sprawdzić klejnot Hashifiable .
źródło
as_json ma bardzo elastyczny sposób konfigurowania złożonych obiektów zgodnie z relacjami modelu
PRZYKŁAD
Modelowa kampania należy do sklepu i ma jedną listę
Lista modeli ma wiele list_tasks, a każde z list_tasks ma wiele komentarzy
Możemy uzyskać jeden plik json, który łatwo łączy wszystkie te dane.
Ogłoszenie o metody:: tagi mogą pomóc dołączyć żadnego dodatkowego przedmiotu, który nie ma relacji z innymi. Wystarczy zdefiniować metodę z tagami nazw w modelowej kampanii . Ta metoda powinna zwrócić wszystko, czego potrzebujesz (np. Tags.all)
Oficjalna dokumentacja dla as_json
źródło
to_
Wariant wydaje się działać niemal dokładnie taki sam jakas_
wariant, z wyjątkiem cytowanego wyjściu. Jedyne, co mi się nie podobało, to brak zachowania kolejności moich kryteriów filtrowania. Wydaje się, że jest posortowany alfabetycznie. Myślałem, że jest to związane z klejnotem awesome_print, który mam w swoim środowisku, ale nie sądzę, że tak jest.Możesz uzyskać atrybuty obiektu modelu zwrócone jako skrót za pomocą jednego z nich
lub
as_json
umożliwia dołączenie asocjacji i ich atrybutów, a także określenie, które atrybuty należy uwzględnić / wykluczyć (zobacz dokumentację ). Jeśli jednak potrzebujesz tylko atrybutów obiektu podstawowego, testy porównawcze w mojej aplikacji z Ruby 2.2.3 i railsami 4.2.2 pokazują, żeattributes
zajmuje to mniej niż połowę czasuas_json
.źródło
Jest tutaj kilka świetnych sugestii.
Myślę, że warto zauważyć, że model ActiveRecord można potraktować jako hash w ten sposób:
Dlatego zamiast generować skrót atrybutów, możesz użyć samego obiektu jako skrótu.
źródło
Zdecydowanie możesz użyć atrybutów, aby zwrócić wszystkie atrybuty, ale możesz dodać metodę instancji do Post, nazwać ją „to_hash” i poprosić o zwrócenie danych, które chcesz w haszu. Coś jak
źródło
nie jestem pewien, czy tego potrzebujesz, ale spróbuj tego w konsoli Ruby:
oczywiście zwróci ci hash w konsoli. jeśli chcesz zwrócić hash z wnętrza metody - zamiast po prostu "h", spróbuj użyć "return h.inspect", coś podobnego do:
źródło
Moje rozwiązanie:
źródło
Odpowiedź Swananda jest świetna.
jeśli używasz FactoryGirl, możesz użyć jego
build
metody do wygenerowania skrótu atrybutu bez kluczaid
. na przykładźródło
Stare pytanie, ale z dużą ilością odniesień ... Myślę, że większość ludzi używa innych metod, ale istnieje
to_hash
metoda, która musi być poprawnie ustawiona. Ogólnie rzecz biorąc, pluck jest lepszą odpowiedzią po szynach 4 ... odpowiadając na to głównie dlatego, że musiałem przeszukać grupę, aby znaleźć ten wątek lub cokolwiek przydatnego i zakładając, że inni mają ten sam problem ...Uwaga: nie polecam tego wszystkim, ale skrajne przypadki!
Z ruby na rails api ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
źródło