ume

RSpec factoryのアソシエーション

対象者

  • アソシエーションとは何か知りたい方.

  • RSpec学習者(初学者)

目次

  1. アソシエーションとは

  2. アソシエーションのメリットを実例を踏まえて見てみよう.

アソシエーションとは

⇨簡単に関連するデータを取得するためにつける機能.
おそらく「関連するデータ?」と思われたと思いますが最後までこの記事を読んでいただければご理解いただけます。

アソシエーションのメリットを実例を踏まえて見てみよう.

もし2つのテーブルにアソシエーションをしていない状態でルフィの全ての技名(ゴムゴムのピストル、ガトリング)を取得したい場合。

@user = User.find(1)
@skills =  Skill.where(user_id:  @user.id)
puts @skills 
出力結果
ゴムゴムのピストル
ゴムゴムのガトリング

↑コードの意味User.find(1)でUser テーブルのid:1とname:ルフィを取得し@userに代入、 Skill.where(user_id: @user.id)でSkillテーブルの中にあるuser_idカラムから@user.id=1のもの全てを取得し@skillsに代入。最後にputs @skilsで出力。 まとめるとUser.find(1)で取得したルフィのデータに関連するデータ(ゴムゴムのピストル、ガトリング)をSkillテーブルから取得する時Userテーブルにあるidを使ってSkillテーブルから関連データを取得する。

アソシエーションがある場合↓

@user = User.find(1)
@skills =  @user.skills
puts @skills 
出力結果
ゴムゴムのピストル
ゴムゴムのガトリング

アソシエーションがない場合と比べて何が違うかというと 2行目が@skills = @user.skillsとなっている。 やっていることはSkill.where(user_id: @user.id)と変わらない。この書き方はなんぞや?と思ったのではないでしょうか。 この書き方の公式は↓です。 @skills = モデルオブジェクト.関連名.
モデルオブジェクト=@user.
意味はモデルオブジェクトに関連するレコードを関連名のモデルから取得してくる。

まとめると アソシエーションを行うと可読性が上がるのと Skill.where(user_id: user.id)のようにいちいちuser_idを明示しなくても良くなる=自動的にUserテーブルのidに該当するものをSkillテーブルのuser_idから見つけ該当するレコードを全て取得してくれる。