はじめに
この記事は2023年度の振り返りです。
こちらの続きとなります。
問題を解いてる時の実話を元に、作成しております
勉強会内の小話
講師:よし、最後のリレーションの問題だ!
講師:「アイシールド21」と同じ作者が書いた作品全てを返すリレーションを作ってみよ!
初学者達:はい!
初学者達:これでどうでしょう!
class Comic < ApplicationRecord
has_many :kaku, foreign_key: 'book_id', class_name: 'Write'
has_many :kaita_hito, through: :kaku, source: :hito
has_many :onaji_sakusya, through: :kaita_hito, source: :kaita_manga
end
class Write < ApplicationRecord
belongs_to :hito, foreign_key: 'user_id', class_name: 'Author'
belongs_to :manga, foreign_key: 'book_id', class_name: 'Comic'
end
class Author < ApplicationRecord
has_many :kaita, foreign_key: 'user_id', class_name: 'Write'
has_many :kaita_manga, through: :kaita, source: :manga
end
講師:お?じゃぁ、確認してみよう
comic = Comic.find_by(name: 'アイシールド21')
comic.onaji_sakusya
SELECT `comics`.*
FROM `comics`
INNER JOIN `writes` ON `comics`.`id` = `writes`.`book_id`
INNER JOIN `authors` ON `writes`.`user_id` = `authors`.`id`
INNER JOIN `writes` `kakus_onaji_sakusya` ON `authors`.`id` = `kakus_onaji_sakusya`.`user_id`
WHERE `kakus_onaji_sakusya`.`book_id` = 3
=>
[#<Comic:0x00007f185bb75280
id: 3,
name: "アイシールド21",
created_at: Sat, 23 Dec 2023 02:56:25.513233000 UTC +00:00,
updated_at: Sat, 23 Dec 2023 02:56:25.513233000 UTC +00:00>,
#<Comic:0x00007f185bb75140
id: 4,
name: "ワンパンマン",
created_at: Sat, 23 Dec 2023 02:56:25.520151000 UTC +00:00,
updated_at: Sat, 23 Dec 2023 02:56:25.520151000 UTC +00:00>]
講師:お?素晴らしい!一発合格じゃないか!完璧にマスターしたんじゃないか?
初学者達:フローは微妙なんですよね。。。
講師:なるほど。フローにするとこんな感じだな
初学者達:余計わかんねーよ!!
講師:すまん。自分も書いててこんがらかってきた。ただ、事前にリレーションを書いておくことで、呼び出すときが楽になったりするので使うと思うリレーションは書いていた方が楽だぞ
初学者達:わかりました!
さいごに
無事に開催の雰囲気の記事がかけてよかったです。
最後までご拝読されていた方は、最後までお付き合い下さいましてありがとうございました。
こんな感じで日々勉強会を開催してたりします。
自分は初学者に対しては、ベストプラクティスを教えるより、多くの手段を学んで頂きたいと考えております。その上で、場面に応じたベストプラクティスを自分たちで模索して利用して言ってくれればと思っております。
少し上から目線になってしまいましたが、自分も日々精進が必要なので、今後も色々なものをアウトプットしていきたいと思います。