1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails→Vue]一対多の関係にある親子オブジェクトをネストさせた状態で取得する

Last updated at Posted at 2021-07-29

[Vue→Rails]ネストされた状態の親子孫オブジェクト(一対多の関係あり)を全て同時にデータベースに保存するでは、Vue側で作ったネストされたデータを複数のテーブルに保存した。
この記事では、別々のテーブルに保存されたそれらのデータを再びネストされた形でVueコンポーネント側で取得する。

前提条件

モデル

親:School
子:Student

school.rb
# 親
class School
 has_many :students
student.rb
# 子
class Student
 belongs_to :school

保存されているレコード

School
{ id: 1, school_name: 'first' }
{ id: 2, school_name: 'second'}

Student
{ id: 1, student_name: 'Suzuki', age: 13, school_id: 1 }
{ id: 2, student_name: 'Hirano', age: 14, school_id: 1 }
{ id: 3, student_name: 'Nagai',  age: 15, school_id: 1 }
{ id: 4, student_name: 'Sato',   age: 13, school_id: 2 }
{ id: 5, student_name: 'Iguchi', age: 14, school_id: 2 }
{ id: 6, student_name: 'Arai',   age: 15, school_id: 2 }

axios.getによるデータの取得

$axiosはインスタンスプロパティに追加済み
schools#indexにgetリクエストを送りデータを取得する

<script>
...
  this.$axios.get('schools')
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.log(err)
  })
...
</script>

コントローラ

to_jsonメソッドの使用

includeオプションでstudentsを指定する。school.studentsで取得されるstudentの配列をschoolにネストさせることができる。

schools_controller.rb
  def index
    schools = School.all
    string = schools.map.to_json(include: :students)

    render json: string
  end

取得できるデータ

to_jsonのincludeオプションで指定した'students'がそのままキー名になる。

data: [
   {
      schoolName: 'first',
      students: [  // studentsがそのままキー名になる
         { studentName: 'Suzuki', age: 13 },
         { studentName: 'Hirano', age: 14 },
         { studentName: 'Nagai',  age: 15 }
      ]
   },
   {
      schoolName: 'second',
      students: [
        { studentName: 'Sato',   age: 13 },
        { studentName: 'Iguchi', age: 14 },
        { studentName: 'Arai',   age: 15 }
      ]
   }
]

【追記】 キー名を変えたいとき

students以外のキー名にしたいとき(例:studentDataなど)
※キャメルケースの場合、一応Rubocopから怒られます

モデル

アソシエーションを取得するメソッドを親側に新しく定義し、目的のキー名をメソッド名にする。

school.rb
class School < ApplicationRecord
  has_many :students

  def studentData # 目的のキー名
    self.students
  end
end

コントローラ

to_jsonメソッドのmethodsオプションでそのメソッド名を指定する。
メソッド名がそのままキー名になる。

schools_controller.rb
  def index
    schools = School.all
    string = schools.map.to_json(methods: :studentData)

    render json: string
  end

取得できるデータ

data: [
   {
      schoolName: 'first',
      studentData: [ // studentDataがそのままキー名になる
         { studentName: 'Suzuki', age: 13 },
         { studentName: 'Hirano', age: 14 },
         { studentName: 'Nagai',  age: 15 }
      ]
   },
   {
      schoolName: 'second',
      studentData: [
        { studentName: 'Sato',   age: 13 },
        { studentName: 'Iguchi', age: 14 },
        { studentName: 'Arai',   age: 15 }
      ]
   }
]

参考文献

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?