概要
今回は先日改めて学んだ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
only
はexcept
とは違いデータ取得の際、__指定したカラムのみ取得__するオプションです。
user.to_json(only: :name)
# => "{ \"name\":\"user1\" }"
4. methods
methods
はデータ取得の際に、__メソッドの実行結果を取得__するオプションです。
例えば、下記のようにuser
のname
が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
はのコントローラーで結構使用するのでもし詳しく確認したい場合は下記参考文献を参照ください。
参考文献