#author("2022-07-08T15:18:45+00:00","default:src128","src128") #author("2022-07-08T15:19:08+00:00","default:src128","src128") &tag(Rails/JSON); *目次 [#y25de75b] #contents *関連ページ [#if6cefb2] *参考情報 [#h11cacd4] *ActiveRecordのサブクラスをJSONに変換 [#jc79ea3b] **一番簡単な例 [#a4157da9] -to_jsonで変換可能 #pre{{ book = Book.new book.title = "abc" json = book.to_json # puts jsonでもよいがわかりやすくフォーマットしたい場合以下を使う。 puts JSON.pretty_generate(JSON.parse(json)) }} -以下の出力が得られる #pre{{ { "id": null, "title": "abc", "author": null, "summary": null, "created_at": null, "updated_at": null, } }} **モデル名を追加する [#peab1bfa] -モデル名を追加したい場合「ActiveRecord::Base.include_root_in_json = false」あるいは「to_json(root: true)」を使用する。 #pre{{ ActiveRecord::Base.include_root_in_json = false book = Book.new book.title = "abc" json = book.to_json(root: true) #puts json puts JSON.pretty_generate(JSON.parse(json)) }} -以下の出力が得られる #pre{{ { "book": { "id": null, "title": "abc", "author": null, "summary": null, "created_at": null, "updated_at": null, } } }} **カスタム属性を追加する [#cb8f47e0] -テーブルに対応していないデータを出力したい場合、as_jsonをオーバーライドする。rootを出力するかどうかを考慮すると以下のような感じ? #pre{{ def as_json(options = nil) root = if options && options.key?(:root) options[:root] else include_root_in_json end result = super(options) h = result if root h = result[model_name.element] end h["custom_title"] = "custom #{title}" result end }} -出力。 #pre{{ { "book": { "id": null, "title": "abc", "author": null, "summary": null, "created_at": null, "updated_at": null, "custom_title": "custom abc" } } }}