Slide 1

Slide 1 text

©2021 Wantedly, Inc. computed_model RailsϞσϧͷpreloadʹடংΛ༩͑Δ Oct 23, 2021 - Masaki Hara (@qnighy ) At Kaigi on Rails 2021 1

Slide 2

Slide 2 text

©2021 Wantedly, Inc. 8BOUFEMZʹ͓͚Δ3BJMT 2  ϞϊϦε3BJMT w 3BJMT7JFXΛͨ͘͞Μ͍࣋ͬͯΔ  3BJMTϚΠΫϩαʔϏε w ΄ͱΜͲ͸"1*0OMZ w ͦΕͧΕʹ%#Λ࣋ͭ w ͓ޓ͍͸)551 +40/PSH31$ QSPUPCVGͰ௨৴ ৄ͘͠͸ҎԼͷϖʔδ΋ࢀর https://www.wantedly.com/companies/wantedly/post_articles/193633 https://docs.wantedly.dev/

Slide 3

Slide 3 text

©2021 Wantedly, Inc. class User < ApplicationRecord def short_description current_job.then { |c| "#{c.company_name} #{c.position}" } end def current_job jobs.sort { ... }.find { ... } en d end DPNQVUFE@NPEFMͷಈػ Model method 3

Slide 4

Slide 4 text

©2021 Wantedly, Inc. class User < ApplicationRecord has_many :jobs end users = User.where(...).preload(:jobs).to_ a DPNQVUFE@NPEFMͷಈػ Preload 4

Slide 5

Slide 5 text

©2021 Wantedly, Inc. users = User.where(...).preload(:jobs).to_ a users.each do |user | sd = user.short_descriptio n .. . end DPNQVUFE@NPEFMͷಈػ Model method + preload 5

Slide 6

Slide 6 text

©2021 Wantedly, Inc. ੍໿  "DUJWF3FDPSEʹґଘ͠ͳ͍ w ଞϚΠΫϩαʔϏε͔Βऔಘ͢Δ৘ใ΋͋Δ w ෳ਺ιʔε͔Βͷ৘ใͷऔಘ΋ඞཁ  ωετͨ͠QSFMPBE  7JFXʹඥ෇͔ͳ͍ w (SBQI2-ͳͲಛఆͷϓϩτίϧʹΑΒͣɺ൚༻తʹ࢖͍͍ͨ 6

Slide 7

Slide 7 text

©2021 Wantedly, Inc. class User dependency :current_job computed def short_description current_job.then { |c| "#{c.company_name} #{c.position}" } end dependency :jobs computed def current_job jobs.sort { ... }.find { ... } end end ղ๏ .PEFMʹґଘؔ܎Λॻ͘ એݴ͍ͯ͠ͳ͍ґଘؔ܎Λ࢖͏ͱ࣮ߦ࣌ΤϥʔʹͳΔ 7

Slide 8

Slide 8 text

©2021 Wantedly, Inc. class User include ComputedModel::Mode l dependency :current_job computed def short_description ... en d dependency :jobs computed def current_job ... end end ղ๏ .PEFMʹґଘؔ܎Λॻ͘ %FQFOEFODZ DPNQVUFE͸$PNQVUFE.PEFM.PEFM͔Βར༻Ͱ͖Δ 8

Slide 9

Slide 9 text

©2021 Wantedly, Inc. users = User.list(user_ids, [:short_description] ) users.each do |user | sd = user.short_descriptio n .. . end ղ๏ ཉ͍͠ϑΟʔϧυΛࢦఆͯ͠ϩʔυ ࢦఆ͍ͯ͠ͳ͍ϑΟʔϧυΛ௚઀࢖͏ͱ࣮ߦ࣌ΤϥʔʹͳΔ 9

Slide 10

Slide 10 text

©2021 Wantedly, Inc. class User define_primary_loader :raw_user do |subfields, ids: | RawUser.where(id: ids).preload(subfields).map do |raw_user | User.new(raw_user ) end end end ղ๏ σʔλιʔε΋ࣗ෼Ͱॻ͘ ͔ͩΒɺͲΜͳσʔλιʔεʹ΋ద߹͢Δ 10

Slide 11

Slide 11 text

©2021 Wantedly, Inc. class User define_primary_loader :raw_user { ... } define_loader :books, key: -> { id } do |user_ids, _subfields, ** | BookApi.list(user_id: user_ids).group_by(&:user_id ) end end ղ๏ ෳ਺σʔλιʔε ϚΠΫϩαʔϏε܈͔Β৘ใΛ͔͖ूΊΔͷ΋؆୯ 11

Slide 12

Slide 12 text

©2021 Wantedly, Inc. ࣾ಺ͷར༻ྫ  6TFSϞσϧ w Ϣʔβʔͷ৘ใʹؔ৺Λ࣋ͭαʔϏε͸ଟ͍ w ͦͷͨΊɺෳ਺ͷϚΠΫϩαʔϏε͔Β৘ใΛ 
 ू໿͢Δඞཁ͕͠͹͠͹ੜ͡Δ  ݖݶ؅ཧ w "DUJWF3FDPSEͷϞσϧΛϥοϓͯ͠ɺ 
 ݟ͍͍ͯ৘ใ͚͕ͩϑΟϧλ͞ΕͨϞσϧΛ࡞Δ 12

Slide 13

Slide 13 text

©2021 Wantedly, Inc. ࣾ಺ͷར༻ྫ  γϦΞϥΠβ w ϞσϧͰ͸ͳ͘Ϗϡʔଆʹ࢖ͬͨྫ w 👉QCTFSJBMJ[FSHFN 
 IUUQTHJUIVCDPNXBOUFEMZQCTFSJBMJ[FS 13

Slide 14

Slide 14 text

©2021 Wantedly, Inc. ·ͱΊ  1SFMPBE࣌ͷґଘղܾΛ࣮૷ͨ͠  "DUJWF3FDPSEҎ֎ʹ΋ରԠ  ෳ਺ϚΠΫϩαʔϏε͔Βͷ৘ใͷू໿ʹ΋࢖͑Δ https://github.com/wantedly/computed_model 14