LoginSignup
0
0

More than 1 year has passed since last update.

Railsにおけるto_jsonのオプション

Posted at

概要

今回は先日改めて学んだto_jsonのオプションについてアウトプットしたいと思います。
Railsのコントローラーなどでよく使用します。

環境

ruby: '3.0.1'
rails: '6.1.4.1'

to_jsonについて

to_jsonとは

to_jsonとはオブジェクトをJSON形式に変換してくれるメソッドです。

user = { id: 1, name: 'user1', age: 22 }

user.to_json #=> "{ \"id\":1, \"name\":\"user1\", \"age\":22 }"

なお上記user定義はこの後の説明で使用していきます。

よく使用するオプション各種

1. include

include関連付けされているテーブルのカラムも一緒に取得できるオプションです。
例えば、userを取得するときにそのuserが投稿したpostデータも一緒に取得したい場合などに使用します。

class User < ApplicationRecord
  has_many :posts
end
user.posts = [{ id: 1, content: 'example_content' }] # userのpostデータ

user.to_json(include: :posts)
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"posts\":[{\"id\":1, \"content\":\"example_content\"}] }"

2. except

exceptはデータを取得するときに指定したカラムを排除できるオプションです。
例えばuserを取得する際にageカラムが必要ない場合

user.to_json(except: :age)
#=> "{ \"id\":1, \"name\":\"user1\" }"

上記のようにageを排除することができます。

3. only

onlyexceptとは違いデータ取得の際、指定したカラムのみ取得するオプションです。

user.to_json(only: :name)
#=> "{ \"name\":\"user1\" }"

4. methods

methodsはデータ取得の際に、メソッドの実行結果を取得するオプションです。
例えば、下記のようにusernameが10文字以上であるかを判定するインスタンスメソッドが定義されていると仮定します。

def over_name?
  name.length >= 10
end
user.to_json(methods: :over_name?)
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"over_name?\":false }"

<備考>

複数のオプションを使用する場合

複数のオプションを使用する場合はオブジェクト形式で渡します。

user.to_json(include: { posts: { only: :content } }
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"posts\":[{\"content\":\"example_content\"}] }"

まとめ

to_jsonはのコントローラーで結構使用するのでもし詳しく確認したい場合は下記参考文献を参照ください。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0