Slide 1

Slide 1 text

とあるプロジェクトで コードを書き始めた僕が つまづいた石たち 2019.04.05 TGIF @zaru

Slide 2

Slide 2 text

site = Site.find site_id

Slide 3

Slide 3 text

いたるところにある Site.find id | Site.find name … site.name というのは c1234567890 のような識別子

Slide 4

Slide 4 text

まさかの find を override していた def find id any_of({_id: id}, {name: id}).first end id もしくは name どちらでもヒットする 気持ちはわかるけど検索キーはどちらかに統一したほうが良い なぜならアプリケーション全体で id と name どちらで持ち回るのか が曖昧になる。ここで透過的に処理するのではなく、もう少し手前 で透過的な処理をしたほうが良い 例外出すと信じてたのに…

Slide 5

Slide 5 text

site = Site.find site_id

Slide 6

Slide 6 text

特定ドキュメントの場合、とにかく遅い 大量にある embeds_many が原因 ferret One サービスサイトだと 5MB 以上ある fetch するのに 200-300msec くらいかかってた Site.without(:hoge) や Site.only(:piyo) でスリムに 20-30msec くらいに改善 embeds_many -> has_many にしたい

Slide 7

Slide 7 text

Site.without(:hoge).find

Slide 8

Slide 8 text

mongoid の仕様で一部のフィールドのみを取得した場合は save でき ない set で直接書き換えるしかない… site = Site.without(:hoge).first site.title = 'update' site.save # NG site.set(title: 'update') # OK これは今後しんどくなりそうな雰囲気を感じている ActiveRecord ってどうだったっけ… ?

Slide 9

Slide 9 text

response = RestClient.get(query_images)

Slide 10

Slide 10 text

これ自体はなんてことはない普通のコード rest-client という gem を使っている ただし Gem le には rest-client は存在しない mailjet というメール配信の gem が rest-client に依存 それを利用している… しかし mailjet はもう使っていないので gem を削除すると死ぬ そして faraday という別の HTTP クライアント gem がありバッティ ングしている

Slide 11

Slide 11 text

resources :hoge

Slide 12

Slide 12 text

resources :hoge ← 全部 action あるのかな? 実は使っているのは update だけでした only except を使った方が良い

Slide 13

Slide 13 text

# TODO: これは使われているのか… ?

Slide 14

Slide 14 text

テストコードやリファクタをする際に、メソッドが使われているの か使われていないのかが、すぐ判断できなかった そのメソッドに依存したコードが山のようにあるし URL も露出し ている lograge -> redash があったので実際に call されているかどうかで判 断 使わなくなったコードはすぐに削除しましょう

Slide 15

Slide 15 text

TemporaryPage.find(1).site_id

Slide 16

Slide 16 text

Site has_many Page TemporaryPage extends Page temporary_page.site #=> temporary_page.site_id #=> nil リレーションしているのだからあるはずでは… ? def site で定義されていた… def site self.public_page.try(:site) end

Slide 17

Slide 17 text

どんどん良くしていくぞ! という気持ち