0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

今まで知らなかった開発で使ったRailsメソッド備忘録

Last updated at Posted at 2022-09-14

なぜ記事を書こうと思ったか

Railsアプリの開発をする際に適切なメソッドを調べる時がある為、今まで知らなかったまたは理解が曖昧な開発で使用するメソッドを中心にこの記事にまとめようと思います。

railsメソッド一覧

Regexpクラス

  • escapeメソッド
    メタ文字をエスケープした結果を返す。
pattern = Regexp.escape('1+2=3,2*3=6')
p pattern
# '1//+2=3,2//*3=6'

Stringクラス

  • subメソッド
    文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成して返す。
greeting = "I am name. My favorite food is meet."
pattern = { "name" => "James", "meet" => "beef" }
replaced = article.sub(/name|meet/, pattern)

p replaced # "I am James. My favorite food is beef."

Arrayクラス

  • flattenメソッド
    自身を再帰的に平坦化した配列を生成して返す。flatten! は自身を再帰的かつ破壊的に平坦化し、平坦化した場合は平坦化した自身をしてない場合は nil を返します。
array1 = [1, 2, [3, 4], 5]
array2 = [1, 2, 3]
p array1.flatten # [1, 2, 3, 4, 5]
p array1.flatten! # [1, 2, 3, 4, 5]
p array2.flatten! # nil

Hashクラス

  • flattenメソッド
    設定する引数に従って自身を平坦化した配列を生成して返します。
hash =  {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
a.flatten     #=> ["name", "tanaka", hobbies, ["サッカー", "映画鑑賞"], "age", 20]
a.flatten(1)  #=> ["name", "tanaka", hobbies, ["サッカー", "映画鑑賞"], "age", 20]
a.flatten(2)  #=> ["name", "tanaka", hobbies, "サッカー", "映画鑑賞", "age", 20]
a.flatten(0)  #=> [["name", "tanaka"], [hobbies, ["サッカー", "映画鑑賞"]], ["age", 20]]
a.flatten(-1) #=> ["name", "tanaka", hobbies, "サッカー", "映画鑑賞", "age", 20]
  • has_key?
    ハッシュにキーが存在するか確認する。
hash = {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
hash.has_key?("name") # true
hash.has_key?("height") # false
  • has_value?
    ハッシュに値が存在するか確認する。
hash = {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
hash.has_value?(20) # true
hash.has_value?(25) # false

JSONクラス

  • parseメソッド
    JSON形式の文字列をRubyのHashオブジェクトに変換して返す
json = "{"Name":"太郎","age":23}"
hash = JSON.parse(json)
p hash # {"Name"=>"太郎", "age"=>23}
  • generateメソッド
    与えられたオブジェクトを一行の JSON 形式の文字列に変換して返す
json = "{"Name":"太郎","age":23}"
hash = JSON.generate(json)
p hash # {\"Name\":\"太郎\", \"age\":23}

TIMEクラス

  • zoneメソッド
    タイムゾーンを表す文字列を返す。
Time.zone = 'Tokyo'
Time.zone # #<ActiveSupport::TimeZone:0x00007f86108d1a38 @name="Asia/Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil>
  • strftimeメソッド
    時刻をフォーマット文字列に従って文字列に変換した結果を返す。
now = Time.zone.now
p now.strftime('%Y/%m/%d') # 2022/09/02
  • beginning_of_monthメソッド
    月の初めの日付を取得
time = Time.now
p time.beginning_of_month # Sat, 01 Aug 2022
  • end_of_monthメソッド
    月の最後の日付を取得
time = Time.now
p time.end_of_month # Sat, 31 Aug 2022

CGIクラス

  • escapeメソッド
    与えられた文字列を URL エンコードした文字列を新しく作成し返す。
p CGI.escape('株式会社IT')   #=> "%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEIT"
  • unescapeメソッド
    与えられた文字列を URL デコードした文字列を新しく作成し返します。
p CGI.unescape('%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEIT')   #=> "株式会社IT"

Exceptionクラス

  • backtraceメソッド
    例外処理を行うときに、例外が発生したときのプログラムの呼び出し状況を取得する。どの部分で例外が発生したか確認できる。
begin
  raise 'dummy'
rescue => e
  puts e.backtrace.join("\n")
  # ["file_name.rb:2:in `method_name'", "filename.rb:2"]
end

Sanitizationクラス

  • sanitiza_sql_like
    SQL LIKEステートメント内で安全に使用できるように、 string をサニタイズし、「_」、および「%」のすべての出現をエスケープする。
User.where('name LIKE ?', "%#{ActiveRecord::Base.sanitize_sql_like("田中")}%")
# User Load (4.4ms)  SELECT `users`.* FROM `users` WHERE (name LIKE '%田中%')

EnvironmentInquirerクラス

  • envメソッド
    現在の環境を確認んすることができる
Rails.env
# "development"

loggerライブラリ

  • loggerメソッド
    Rubyからログを出力するメソッド
logger.debug('*debug logger')
logger.info('*info logger')
logger.warn('*warn logger')
logger.error('*error logger')
logger.fatal('*fatal logger')
logger.unknown('*unknown logger')

# 以下ログ出力
D, [2017-09-22T10:08:39.414406 #16980] DEBUG -- : *debug logger
I, [2017-09-22T10:08:39.414406 #16980]  INFO -- : *info logger
W, [2017-09-22T10:08:39.414406 #16980]  WARN -- : *warn logger
E, [2017-09-22T10:08:39.414406 #16980] ERROR -- : *error logger
F, [2017-09-22T10:08:39.414406 #16980] FATAL -- : *fatal logger
A, [2017-09-22T10:08:39.414406 #16980]   ANY -- : *unknown logger

URIライブラリ

  • encode_www_form_componentメソッド
    文字列を URL-encoded form data の1コンポーネントとしてエンコードした文字列を返します。
p URI.encode_www_form_component('エンコードしたい')
# "%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%81%84"

ActiveRecord

  • includesメソッド
    関連するテーブルをまとめて取得
Employee.includes(:department)
# SELECT "employees".* FROM "employees"
# SELECT "departments".* FROM "departments" WHERE "departments"."id" IN (1)
  • mergeメソッド
    複数の条件を併合する
question = "田中"
User.where(age: 20)
    .merge(
      User.where('name LIKE ?',
                          "%#{ActiveRecord::Base.sanitize_sql_like(question)}%")
      .or(User.where('email LIKE ?',
                              "%#{ActiveRecord::Base.sanitize_sql_like(question)}%"))
    )
# User Load (1.4ms)  SELECT users.* FROM `users` WHERE `age` = 20 AND (name LIKE '%田中%' OR email LIKE '%田中%')
  • maximumメソッド
    カラムの最大値を返す
User.maximum('age')
# SELECT MAX("users"."age") AS max_id FROM "users"
  • enumメソッド
    1つのカラムに対して複数個の定数を持たせる為のメソッド
enum sex: { men: 0, women: 1}
p User.sex
# { "men" => 0, "women" => 1}

ActiveModel

  • as_jsonメソッド
    モデルをハッシュ形式のJSONに変換
user.as_json
# {id: 1, name: "Tanaka Taro", age: 24, created_at: "2022-08-31T17:27:133.000Z"}
  • groupメソッド
    指定したカラムごとにデータをまとめることができる。
User.group(:company_id).count
SELECT COUNT(*) AS count_all, `users`.`company_id` AS users_company_id FROM `users` GROUP BY `users`.`company_id`
# {1=> 22, 2=> 40}
  • eager_loadメソッド
    左外部結合を使ってすべてのレコードを取得する
User.eager_load(:company)
# SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ...
# FROM "users" LEFT OUTER JOIN "companies" ON "companies"."user_id" =
# "users"."id"

ActiveJob

  • perform_nowメソッド
    同期的にSampleJobを呼び出す
def execute_now
  puts '実行開始'
  SampleJob.perform_now('実行中')
  puts '実行終了'
end

# 実行開始
# Performing SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) with arguments: "実行中"
# [JOB] start: 実行中
# [JOB] end: 実行中
# Performed SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) in 3005.48ms
# 実行終了
  • perform_laterメソッド
    非同期的にSampleJobを呼び出す
def execute_later
  puts '実行開始'
  SampleJob.perform_later('実行中')
  puts '実行終了'
end

# 実行開始
# Enqueued SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) to Async(default) with arguments: "実行中"
# Performing SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) with arguments: "実行中"
# 実行終了
# [JOB] start: 実行中
# [JOB] end: 実行中
# Performed SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) in 3005.48ms

最後に

改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?