Introduce ActiveSupport methods

9b600b6d2f592d0944507e989770b9b3?s=47 issei126
October 21, 2020

Introduce ActiveSupport methods

9b600b6d2f592d0944507e989770b9b3?s=128

issei126

October 21, 2020
Tweet

Transcript

  1. ©iCARE Co., Ltd All rights reserved 株式会社iCARE
 ActiveSupportのマイナーだけど
 便利なメソッド
 1

    中村 一星

  2. ©iCARE Co., Ltd All rights reserved 自己紹介
 • 中村 一星(いっせい)

    • @ise_tang • エンジニア/テックリード • だいたい Ruby on Rails と たまに Vue.js を書きます • ダーツが好きです。 ◦ ダーツチョットデキル ▪ カウントアップのハイスコアは1061です 2
  3. ©iCARE Co., Ltd All rights reserved 最近Circle CIのOrbを公開しました
 https://circleci.com/orbs/registry/orb/icare-jp-oss/only-build-pull-requests- with-git-flow


    3
  4. ©iCARE Co., Ltd All rights reserved 本日のお題
 4

  5. ©iCARE Co., Ltd All rights reserved 5 みなさん、ActiveSupport つか いこなしてますか?


  6. ©iCARE Co., Ltd All rights reserved 6 つかいこなすために、
 いろんなメソッドを知ろう


  7. ©iCARE Co., Ltd All rights reserved ということで
 7 マイナーだけど
 便利なメソッドをご紹介


  8. ©iCARE Co., Ltd All rights reserved 8 ただ自分が知らないだけ だったらごめんなさい


  9. ©iCARE Co., Ltd All rights reserved 便利アプリ
 9 • Dash

    
 ◦ https://kapeli.com/dash
 • APIドキュメント検索アプリ
 • 30日間無料/$29.99
 • Ruby/Ruby on Rails 以外にもVue.jsやDockerなどさまざまな
 APIドキュメントが検索可能

  10. ©iCARE Co., Ltd All rights reserved ぶっちゃけた話
 https://railsguides.jp/active_support_core_extensions.html
 こちらをご覧いただければ大丈夫()
 10

  11. ©iCARE Co., Ltd All rights reserved 気になったものをご紹介します
 11

  12. ©iCARE Co., Ltd All rights reserved in?
 12 include? 的なもの。

    ただ include? とはレシーバと引数の関係が逆 引数がinclude? に応答しない場合はArgumentError例外が発生 > 1.in?([1,3]) => true > 1.in?([2,3]) => false
  13. ©iCARE Co., Ltd All rights reserved Numeric#to_s にはオプションがたくさん
 13 https://github.com/rails/rails/blob/master/activesupport/lib/active_support/c

    ore_ext/numeric/conversions.rb
 > 12345678.to_s(:delimited) => "12,345,678" > 12345678.to_s(:currency) => "12,345,678円" > 524288000.to_s(:human_size) => "500MB"
  14. ©iCARE Co., Ltd All rights reserved remove
 よく "hogehoge".gsub(/ho/, '')と書くことが多いけど


    シンプルに書けます
 14 > 'hogehoge'.remove('ho') => "gege"
  15. ©iCARE Co., Ltd All rights reserved truncate_words
 単語数を指定して切り詰めることができる
 15 >

    "Hello, World. Hello, Ruby".truncate_words(3) => "Hello, World. Hello,..." > "こんにちは。おはようございます。今日は晴れですが、明日は雨です" .truncate_words(3, separator: /[。、]/) => "こんにちは。おはようございます。今日は晴れですが..."
  16. ©iCARE Co., Ltd All rights reserved inquiry
 同値比較ができる文字列 ActiveSupport::StringInquirer を生成する

    Rails.env.production? みたいなものです 
 16 > person_struct = Struct.new("Person", :role) => Struct::Person > person_1 = person_struct.new("employee".inquiry) => #<struct Struct::Person role="employee"> > person_1.role.employee? => true > person_1.role.manager? => false
  17. ©iCARE Co., Ltd All rights reserved squish
 文字列内の先頭、末尾、連続したスペースや改行を削除
 インデントのために追加したスペースを取り除く場合などに便利
 17

    [1] pry(main)> query = <<~QUERY [1] pry(main)* SELECT [1] pry(main)* name, [1] pry(main)* born_on [1] pry(main)* FROM [1] pry(main)* users [1] pry(main)* WHERE [1] pry(main)* id > 10; [1] pry(main)* QUERY => "SELECT\n name,\n born_on\nFROM\n users\nWHERE\n id > 10;\n" [2] pry(main)> query.squish => "SELECT name, born_on FROM users WHERE id > 10;" rubocop-rails の 2.8 で生のSQLを書くときには
 squishを要求するルールが追加されました
 https://github.com/rubocop-hq/rubocop-rails/pull/291

  18. ©iCARE Co., Ltd All rights reserved index_by
 ブロックで評価した値をキーにしたhashを作成できる
 18 [

    {employee_number: 1, name: :taro}, {employee_number: 2, name: :jiro}, {employee_number: 3, name: :sabu} ].index_by { |hash| hash[:employee_number] } => { 1=>{:employee_number=>1, :name=>:taro}, 2=>{:employee_number=>2, :name=>:jiro}, 3=>{:employee_number=>3, :name=>:sabu} } キーが重複しないように注意。
 重複した場合には最後の値のみ使われる

  19. ©iCARE Co., Ltd All rights reserved presence_in
 レシーバが引数に含まれていればそれを、含まれていなければnilを返す
 19 >

    fruits = %w|apple orange banana| => ["apple", "orange", "banana"] > "apple".presence_in(fruits) => "apple" > "grape".presence_in(fruits) => nil 以下のように書くよりもすっきり
 > "apple".in?(fruits) ? "apple" : nil => "apple" > "grape".in?(fruits) ? "apple" : nil => nil
  20. ©iCARE Co., Ltd All rights reserved many?
 collection.size > 1の短縮形


    20 > tasks = [] => [] > tasks.many? => false > tasks = ["work", "work"] => ["work", "work"] > tasks.many? => true 
 > tasks = ["work", "work", "training"] => ["work", "work", "training"] > tasks.many? { |task| task == "training" } => false ブロックを渡してそれに合うものが2個以上あるかを調べることができる

  21. ©iCARE Co., Ltd All rights reserved one?
 one? は Ruby

    の組み込みのメソッドにある
 21 > tasks = [] => [] > tasks.one? => false > tasks = [:work] => [:work] > tasks.one? => true > tasks = [:work, :training] => [:work, :training] > tasks.one? => false > tasks = [:work, :training, :work] => [:work, :training, :work] > tasks.one? { |t| t == :training } => true
  22. ©iCARE Co., Ltd All rights reserved deep_merge
 Hash を再帰的にマージする。深い階層のところもマージされる
 22

    > hash_1 = { a: { b: [1,2,3], c: [4,5,6] } } => {:a=>{:b=>[1, 2, 3], :c=>[4, 5, 6]}} > hash_2 = { a: { d: [7,8,9], e: [0,1,2] } } => {:a=>{:d=>[7, 8, 9], :e=>[0, 1, 2]}} > hash_1.merge(hash_2) => {:a=>{:d=>[7, 8, 9], :e=>[0, 1, 2]}} # a の中は上書きされてしまう > hash_1.deep_merge(hash_2) => {:a=>{:b=>[1, 2, 3], :c=>[4, 5, 6], :d=>[7, 8, 9], :e=>[0, 1, 2]}} # a の中身もmergeされる
  23. ©iCARE Co., Ltd All rights reserved pluck
 指定されたキーに基づく配列を返す
 23 >

    [ {name: :taro, role: :employee}, {name: :jiro, role: :manager} ].pluck(:role) => [:customer, :manager] ActiveRecord::Calculations の pluck とは別もの
 こちらはクエリからして変わる
 > Customer.where(employment_status: "limited") Customer Load (1.3ms) SELECT "customers".* FROM "customers" WHERE "customers"."employment_status" = $1 [["employment_status", 2]] > Customer.where(employment_status: "limited").pluck(:fullname) Customer Load (0.8ms) SELECT "customers"."fullname" FROM "customers" WHERE "customers"."employment_status" = $1 [["employment_status", 2]]
  24. ©iCARE Co., Ltd All rights reserved multiple_of?
 レシーバが引数の倍数かどうかを調べる https://railsguides.jp/active_support_core_extensions.html#multiple-of-q uestionmark

    24 12 % 3 == 0 のように書かなくてすむ。実装はそうなっていますがw > 12.multiple_of?(3) => true > 12.multiple_of?(5) => false
  25. ©iCARE Co., Ltd All rights reserved in_milliseconds
 25 Durationからミリ秒を返してくれる
 1.day.in_milliseconds

    => 86400000 master には in_minutes, in_hours などが追加されている
 https://github.com/rails/rails/blob/master/activesupport/lib/a ctive_support/duration.rb#L357

  26. ©iCARE Co., Ltd All rights reserved ordinalize
 (日本語だとあまり使うところはないかもしれないけど)
 1だったら1st、3だったら3rdなどの文字(序数文字列)を付与できる
 


    26 > 1.ordinalize => "1st" > 3.ordinalize => "3rd" > 13.ordinalize => "13th"
  27. ©iCARE Co., Ltd All rights reserved 使いそうな定数
 メソッドではないですが、使いそうな定数も定義されてます
 27 >

    ActiveSupport::Duration::SECONDS_PER_DAY => 86400 > ActiveSupport::Duration::SECONDS_PER_HOUR => 3600 > ActiveSupport::Duration::SECONDS_PER_MONTH => 2592000
  28. ©iCARE Co., Ltd All rights reserved ActiveSupport のメソッドや Ruby のメソッドをたくさん知って、


    楽しく読みやすいコードをかいていきましょう!
 28
  29. ©iCARE Co., Ltd All rights reserved 29 みなさんも覗いてみてください
 https://github.com/rails/rails/tree/master/activesupport


  30. ©iCARE Co., Ltd All rights reserved 30 ご静聴ありがとうございました