Próbuję przekonwertować model ActiveRecord na JSON w Railsach, a podczas gdy metoda to_json ogólnie działa, wirtualne atrybuty modelu nie są uwzględniane. Czy istnieje sposób wewnątrz Railsów do wyświetlania nie tylko atrybutów modelu, ale także atrybutów attr_accessor i attr_reader, aby wszystkie czytelne atrybuty były dostępne, gdy model jest konwertowany na JSON?Włączając wirtualne atrybuty modelu podczas konwertowania rekordu do JSON w Railsach
Odpowiedz
Przed Rails 3, użyj opcję: metoda:
@model.to_json(:method => %w(some_virtual_attribute another_virtual_attribute))
W Rails 3, użyj : metody opcja
@model.to_json(:methods => %w(some_virtual_attribute another_virtual_attribute))
Nie jestem pewien, czy to zmieniło w Rails 3, ale teraz musisz użyć opcji: methods zamiast: method
Zrobiłem to, aby umieścić informacje chniczne w modelu i zachować metodę kompatybilny z żadnym innym klasa może to nazwać (as_json
jest wywoływana przez to_json
i ma zwrócić Hash
):
class MyModel < ActiveRecord::Base
def as_json options=nil
options ||= {}
options[:methods] = ((options[:methods] || []) + [:my, :virtual, :attrs])
super options
end
end
(testowane w szynach v3.0)
+1: To działało ładnie i podoba mi się pomysł zdefiniowania tego raz w mojej klasie modelu – Besi
+1: Najbardziej elegancki. Dziękuję Ci. –
Naprawdę podobało mi się to rozwiązanie, bardzo eleganckie ... rzeczywiście! Najlepszą częścią tego jest to, że wskoczył on do ActiveAdmin bez żadnych problemów, kontrolery są abstrakcyjne i dynamicznie generowane, więc było to z pewnością najkrótsze rozwiązanie. – ARun32
Inne odpowiedzi odnoszą się do wywołania methods
, które zwraca wszystkie metody, w tym te, które nie są atrybutami. Alternatywnym podejściem byłoby użycie attributes
, która zwraca atrybuty modelu, z tym wyjątkiem, że nie zawiera jego atrybutów wirtualnych.
Jeżeli te są znane, a następnie dodając coś jak poniżej do modelu może pomóc:
VIRTUAL_ATTRIBUTES = %i{foo bar baz}
VIRTUAL_ATTRIBUTES.each { |a| attr_accessor a } # create accessors
def attributes
VIRTUAL_ATTRIBUTES.each_with_object(super) { |a,h| h[a] = self.send(a) }
end
- 1. Jak odkryć atrybuty modelu w Railsach
- 2. Wirtualne atrybuty w szynach 4
- 3. Wirtualne atrybuty i przypisanie masy
- 4. Dostęp do właściwości modelu w Railsach
- 5. Zapisywanie modelu zagnieżdżonego w Railsach 4
- 6. Jak tłumaczyć weryfikację modelu aktywnego rekordu
- 7. Kopiowanie wystąpień modelu w Railsach
- 8. Nietrwałe atrybuty modelu ActiveRecord
- 9. Laravel Wymowne atrybuty modelu
- 10. Uzyskaj atrybuty modelu w backbone.js
- 11. Usuwanie rekordu JSON z .json pliku PHP
- 12. Czy jest coś do hibernacji, który serializuje/deserializuje kolumnę json (lub xml) przekształcając ją w rzeczywiste atrybuty modelu?
- 13. Konwersja JSON do instancji modelu w Django
- 14. Szyny - Dodaj atrybuty nie w modelu i atrybut modelu aktualizacji
- 15. Powielona właściwość json podczas konwertowania obiektu java na ciąg json za pomocą jacksona
- 16. Co powinienem renderować podczas niszczenia rekordu?
- 17. Atrybuty zagnieżdżone w Railsach: wymagają co najmniej dwóch rekordów.
- 18. Jak zminimalizować wyjście JSON w Railsach?
- 19. Jak mam aktywny rekord traktować wirtualne atrybuty, takie jak prawdziwe atrybuty?
- 20. JSON do modelu klasy przy użyciu Django
- 21. Importuj plik json do modelu Django
- 22. Kolumna Postgres JSON aktualizująca poszczególne klucze/atrybuty za pomocą formularza
- 23. @DateTimeFormat z błędem czasu letniego podczas konwertowania
- 24. Jak wybrać tylko określone atrybuty z modelu?
- 25. Odzyskujesz wszystkie atrybuty asocjacji modelu AR?
- 26. Zrozumienie struktury JSON - atrybuty i wartości
- 27. Regex do czasu, ale nie włączając
- 28. Włączając plik XSLT do pliku wykonywalnego
- 29. Model klonu Embera dla nowego rekordu
- 30. Co oznacza słowo wirtualne podczas przesłaniania metody?
Działa to dla mnie, ale wtedy nie mogę filtrować atrybuty używając ': only => [: attr1,: attr2 ] '. Czy istnieje sposób na połączenie ': only' z parametrem': methods'? – Besi
'to_json (only: [: key_a,: key_b], methods: [: method_name])' –