Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

zaru
April 05, 2019

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

zaru

April 05, 2019
Tweet

More Decks by zaru

Other Decks in Technology

Transcript

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

    View Slide

  2. site = Site.find site_id

    View Slide

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

    View Slide

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

    View Slide

  5. site = Site.find site_id

    View Slide

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

    View Slide

  7. Site.without(:hoge).find

    View Slide

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

    View Slide

  9. response = RestClient.get(query_images)

    View Slide

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

    View Slide

  11. resources :hoge

    View Slide

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

    View Slide

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

    View Slide

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

    使わなくなったコードはすぐに削除しましょう

    View Slide

  15. TemporaryPage.find(1).site_id

    View Slide

  16. 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

    View Slide

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

    View Slide