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

Introduce ActiveSupport methods

ise_tang
October 21, 2020

Introduce ActiveSupport methods

Introuduce ActiveSupport methods in iCARE Meetup

ise_tang

October 21, 2020
Tweet

More Decks by ise_tang

Other Decks in Technology

Transcript

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

    • @ise_tang • エンジニア/テックリード • だいたい Ruby on Rails と たまに Vue.js を書きます • ダーツが好きです。 ◦ ダーツチョットデキル ▪ カウントアップのハイスコアは1061です 2
  2. ©iCARE Co., Ltd All rights reserved 便利アプリ
 9 • Dash

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

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

    ただ include? とはレシーバと引数の関係が逆 引数がinclude? に応答しない場合はArgumentError例外が発生 > 1.in?([1,3]) => true > 1.in?([2,3]) => false
  4. ©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"
  5. ©iCARE Co., Ltd All rights reserved truncate_words
 単語数を指定して切り詰めることができる
 15 >

    "Hello, World. Hello, Ruby".truncate_words(3) => "Hello, World. Hello,..." > "こんにちは。おはようございます。今日は晴れですが、明日は雨です" .truncate_words(3, separator: /[。、]/) => "こんにちは。おはようございます。今日は晴れですが..."
  6. ©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
  7. ©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

  8. ©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} } キーが重複しないように注意。
 重複した場合には最後の値のみ使われる

  9. ©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
  10. ©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個以上あるかを調べることができる

  11. ©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
  12. ©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される
  13. ©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]]
  14. ©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
  15. ©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

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