Slide 1

Slide 1 text

3BJMT։ൃΛ͢Δ্Ͱ ஌͓͍ͬͯͨํ͕ྑͦ͞͏ͳ ̍̌ͷ͜ͱʢԾʣ 2015-06-25 @sasata299

Slide 2

Slide 2 text

ࣗݾ঺հ w ͨͭ͞͞ w ώτϝσΟΞॴଐ w ͔Β͋͛ΤϯδχΞ w ٕज़ϒϩά

Slide 3

Slide 3 text

͔Β͋͛ ඒຯ͍͠

Slide 4

Slide 4 text

<13>ຊΛग़͠·ͨ͠

Slide 5

Slide 5 text

ͱ͍͏ࣄۀΛ΍͍ͬͯ·͢ɻ

Slide 6

Slide 6 text

ᶃ)BTIOFX\cI LcI\^^ ᶄ'BU.PEFM ᶅ$PODFSO ᶆϓϨθϯςʔγϣϯ૚ ᶇSBJMTDPOTPMFTBOECPY ᶈQMVDL ᶉpMUFS@QBSBNFUFST ᶊؔ࿈ͨ͠σʔλͷ࡟আ ᶋγϯάϧςʔϒϧܧঝʢ45*ʣ ᶌJODMVEFͱQSFQFOE

Slide 7

Slide 7 text

஌ͬͱ͘ͱྑͦ͞͏ᶃ Hash.new { |h,k| h[k] = {} }

Slide 8

Slide 8 text

> hash = {} => {} > hash[:foo] => nil

Slide 9

Slide 9 text

> hash = Hash.new { |h,k| h[k] = {} } => {} > hash[:foo] => {} # nil͡Όͳ͍ʂ

Slide 10

Slide 10 text

> hash = Hash.new { |h,k| h[k] = {} } => {} > hash[:foo] => {} # nil͡Όͳ͍ʂ > hash[:foo][:bar] => nil > hash[:foo][:bar] = 1 => 1 > hash => { foo: { bar: 1 } }

Slide 11

Slide 11 text

஌ͬͱ͘ͱྑͦ͞͏ᶄ Fat Model

Slide 12

Slide 12 text

Fat Controller Fat Model ??? ୭΋͕௨Δಓ

Slide 13

Slide 13 text

Fat Controller Fat Model ??? ୭΋͕௨Δಓ ServiceΦϒδΣΫτ FormΦϒδΣΫτ, etc..

Slide 14

Slide 14 text

஌ͬͱ͘ͱྑͦ͞͏ᶅ Concern

Slide 15

Slide 15 text

ؔ৺ࣄΛͻͱ͔ͨ·Γʹͯ͠؅ཧ͢Δʂ

Slide 16

Slide 16 text

class Group before_save :set_default_name_if_need def post(comment); end end ! class Message before_save :set_default_name_if_need def post(comment); end end ಉ͡Α͏ͳॲཧ͕͋Δ৔߹

Slide 17

Slide 17 text

module Commentable extend ActiveSupport::Concern ! included do before_save :set_default_name_if_need end ! def post(comment) Comment.create!(content: comment) end end

Slide 18

Slide 18 text

class Group include Commentable end ! class Message include Commentable end εοΩϦ

Slide 19

Slide 19 text

஌ͬͱ͘ͱྑͦ͞͏ᶆ ϓϨθϯςʔγϣϯ૚

Slide 20

Slide 20 text

ϑϧωʔϜΛද͍ࣔͨ͠ʂ

Slide 21

Slide 21 text

module UserHelper def full_name(user) user.last_name + user.first_name end end VTFSΦϒδΣΫτΛ౉͢ͷΠέͯͳ͍

Slide 22

Slide 22 text

class User < ActiveRecord::Base def full_name last_name + first_name end end 7JFXͰ͔͠࢖Θͳ͍ͷʹϞσϧʹஔ͘ʁ

Slide 23

Slide 23 text

module UserDecorator def full_name last_name + first_name end end ྫ͑͹BDUJWF@EFDPSBUPSΛ࢖͏

Slide 24

Slide 24 text

஌ͬͱ͘ͱྑͦ͞͏ᶇ $ rails console —sandbox

Slide 25

Slide 25 text

$ rails console —sandbox > user = User.first => # > user.like = "sushi" => "sushi" > u.save! => true

Slide 26

Slide 26 text

$ rails console —sandbox > user = User.first => # > user.like = "sushi" => "sushi" > u.save! => true > user = User.first => #

Slide 27

Slide 27 text

$ rails console > user = User.first => # ࠶౓DPOTPMFΛ։͘ͱSPMMCBDL͞ΕͯΔ

Slide 28

Slide 28 text

$ rails console > user = User.first => # > _ => # ͪͳΈʹΞϯμʔείΞศརͰ͢

Slide 29

Slide 29 text

஌ͬͱ͘ͱྑͦ͞͏ᶈ pluck

Slide 30

Slide 30 text

ສ݅ͷ6TFSΛ༻ҙͯ͠JEͷҰཡΛऔಘ

Slide 31

Slide 31 text

Benchmark.bm 10 do |r| r.report “select” do User.select(:id).map(&:id) end r.report “pluck” do User.pluck(:id) end end

Slide 32

Slide 32 text

user system total real select 16.290000 0.760000 17.050000 ( 20.753481) pluck 4.350000 0.590000 4.940000 ( 6.712115) ഒҎ্଎͍ͧʂ

Slide 33

Slide 33 text

User.select(:id) [#, #, …] ΦϒδΣΫτΛੜ੒ NBQ JE ͢Δ [1, 2, …]

Slide 34

Slide 34 text

User.pluck(:id) [1, 2, …] ActiveRecordΦϒδΣΫτͷ ੜ੒͕ൃੜ͠ͳ͍෼଎͍ʂ

Slide 35

Slide 35 text

஌ͬͱ͘ͱྑͦ͞͏ᶉ filter_parameters

Slide 36

Slide 36 text

ͦͷ··ͩͱηΩϡΞͳ৘ใ͕ ϩάʹྲྀΕͯ͠·͏ʂʂʼʻ

Slide 37

Slide 37 text

Started POST "/users" Processing by UsersController#create as HTML Parameters: {"email"=>"test@test.com", “password"=>"secret-value", “credit_card_number"=>"1111-2222-3333-4444"}

Slide 38

Slide 38 text

3BJMTBQQMJDBUJPODPOpHpMUFS@QBSBNFUFST <QBTTXPSE DSFEJU@DBSE@OVNCFS> pMUFS@QBSBNFUFSTΛઃఆ͢Δ

Slide 39

Slide 39 text

Started POST "/users" Processing by UsersController#create as HTML Parameters: {"email"=>"test@test.com", "password"=>"[FILTERED]", “credit_card_number"=>"[FILTERED]"}

Slide 40

Slide 40 text

஌ͬͱ͘ͱྑͦ͞͏ᶊ ؔ࿈ͨ͠σʔλͷ࡟আ

Slide 41

Slide 41 text

class Blog < ActiveRecord::Base has_many :articles dependent: :destroy end #MPHΛ࡟আͨ͠Βؔ࿈͢Δ"SUJDMF΋࡟আ͢Δ

Slide 42

Slide 42 text

EFMFUFͱEFTUSPZͷҧ͍ EFMFUF ୯७ʹ%&-&5&จ͕ൃߦ͞ΕΔ͚ͩ EFTUSPZ CFGPSF@EFTUSPZ΍BGUFS@EFTUSPZ΋࣮ߦ͞ΕΔ EFQFOEFOU΋ߟྀ͞ΕΔ

Slide 43

Slide 43 text

஌ͬͱ͘ͱྑͦ͞͏ᶋ γϯάϧςʔϒϧܧঝʢ45*ʣ

Slide 44

Slide 44 text

ྑ͘ࣅͨϞσϧ͸ҰͭͷςʔϒϧͰѻ͓͏ ! 'PPEϞσϧͱ%SJOLϞσϧ͸ྑ͘ࣅͯΔ͔Β QSPEVDUTςʔϒϧͰ·ͱΊͯѻ͓͏ʂతͳ࿩

Slide 45

Slide 45 text

class Product < ActiveRecord::Base # typeΧϥϜΛ͍࣋ͬͯΔ͜ͱʂ end ! class Food < Product; end class Drink < Product; end

Slide 46

Slide 46 text

Food.create! <#Food id: 1, type: "Food", …> ! 2.times { Drink.create! } <#Drink id: 2, type: "Drink", …> <#Drink id: 3, type: "Drink", …>

Slide 47

Slide 47 text

mysql> SELECT id, type FROM products; ! +----+-------+ | id | type | +----+-------+ | 1 | Food | | 2 | Drink | | 3 | Drink | +----+-------+

Slide 48

Slide 48 text

Food.all [#] ! Drink.all [#, #] ! Product.all [#, #, #]

Slide 49

Slide 49 text

஌ͬͱ͘ͱྑͦ͞͏ᶌ include ͱ prepend

Slide 50

Slide 50 text

೚ҙͷϝιουΛੜ΍͍ͨ͠

Slide 51

Slide 51 text

class Bar include Foo end ! p Bar.ancestors # [Bar, Foo, Object, …] #BSΫϥε͕༏ઌ͞ΕΔ

Slide 52

Slide 52 text

class Bar prepend Foo end ! p Bar.ancestors # [Foo, Bar, Object, …] 'PPϞδϡʔϧ͕༏ઌ͞ΕΔ

Slide 53

Slide 53 text

JODMVEFͱQSFQFOEͷڍಈͷҧ͍ JODMVEF ݩͷΫϥεͷޙΖʹ௥Ճ͞ΕΔ ಉ໊ͷϝιουͷ৔߹ɺݩͷΫϥε͕༏ઌ͞ΕΔ QSFQFOE ݩͷΫϥεΑΓલʹ௥Ճ͞ΕΔ ಉ໊ͷϝιουͷ৔߹ɺϞδϡʔϧ͕༏ઌ͞ΕΔ

Slide 54

Slide 54 text

ᶃ)BTIOFX\cI LcI\^^ ᶄ'BU.PEFM ᶅ$PODFSO ᶆϓϨθϯςʔγϣϯ૚ ᶇSBJMTDPOTPMFTBOECPY ᶈQMVDL ᶉpMUFS@QBSBNFUFST ᶊؔ࿈ͨ͠σʔλͷ࡟আ ᶋγϯάϧςʔϒϧܧঝʢ45*ʣ ᶌJODMVEFͱQSFQFOE

Slide 55

Slide 55 text

࠷ޙʹ

Slide 56

Slide 56 text

https://www.wantedly.com/companies/hitomedia ΤϯδχΞืूͯ͠·͢ʂ

Slide 57

Slide 57 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ @sasata299