どうもこんにちは。
今回は、Ruby,Railsでメソッド名を自分のわかりやすい名前に変更して使用する方法を紹介します。
メソッド名を変更して使用する方法
大きく分けて2つです。
-
alias
やalias_method
を使用する - 独自のメソッド名変更メソッドを用意する
ただし、alias
やalias_method
は全てのメソッドに対して使用できる訳ではありません。
以下のメソッドに対してalias
やalias_method
を使用することができます。
- 明示的に定義されたメソッド: クラス内で明示的に定義されたインスタンスメソッドやクラスメソッドには、通常、エイリアスを定義することができます
- 継承されたメソッド: スーパークラスから継承されたメソッドに対してもエイリアスを定義することが可能です
一方でalias
やalias_method
を使用できないメソッドは以下のようなものです。
-
動的に生成されるメソッド: メタプログラミング技術やフレームワークの内部機構によって動的に生成されるメソッド。例えば、RailsのActiveRecordにおける
find_by_*
メソッドやfind_or_create_by_*
メソッド -
特殊なメソッドやキーワード: Rubyの一部の特殊なメソッド(例えば、
initialize
やmethod_missing
)や、言語のキーワード(例えば、class
やdef
)
aliasやalias_methodを使用する方法
すでに提供されているメソッドに対して使用する
前提
RailsのActiveRecord::Base
クラスには、human_attribute_name
というメソッドが定義されています。
これは、config/locales/ja.yml
を参照して、モデルにカラム名を定義した形に変更してもらえるメソッドです。
以下がconfig/locales/ja.yml
の例です。
ja:
activerecord:
models:
contents: コンテンツ
attributes:
contents:
id: ID
title: コンテンツ名
description: 内容
created_at: 登録日時
updated_at: 更新日時
human_attribute_name
を使用するとconfig/locales/ja.yml
を参照して変換してくれます。
# Railsコンソール
pry(main)> Content.human_attribute_name(:title)
=> "コンテンツ名"
pry(main)> Content.human_attribute_name(:created_at)
=> "登録日時"
これをhan
メソッドとして使用できるようにします。
ApplicationRecordに定義
以下のようにapp/models/application_record.rb
に定義します。
class ApplicationRecord < ActiveRecord::Base
class << self
alias han human_attribute_name
end
end
han
メソッドを使用できるか試してみます。
# Railsコンソール
pry(main)> Content.han(:title)
=> "コンテンツ名"
pry(main)> Content.han(:created_at)
=> "登録日時"
できましたね。
自分で定義したメソッドに対して使用する
例えば、Userモデルに以下のようなメソッドが定義されていたとします。
class User < ApplicationRecord
def user_find_in_where
# なんらかの処理
end
end
これに対して、alias
を使用します。
class User < ApplicationRecord
def user_find_in_where
# なんらかの処理
end
alias ufiw user_find_in_where
end
以下の実行結果はどちらも同じになります。
# Railsコンソール
pry(main)> User.find(1).user_find_in_where
pry(main)> User.find(1).ufiw
aliasを使用する時の注意点
- クラスメソッドに対して使用するときは、以下のように記述
class User < ApplicationRecord
class << self
alias 変更後メソッド 変更前メソッド
end
end
- インスタンスメソッドに対して使用するときは以下のように記述
class User < ApplicationRecord
alias 変更後メソッド 変更前メソッド
end
クラスメソッドの定義とインスタンスメソッドの定義も同様です。
上記の違いはRuby SilverかRuby Goldの試験でも出題されます。(Railsに落とし込むとわかりやすい)
独自のメソッド名変更メソッドを用意する
ActiveRecord::Base
にはfind_or_create_by
というメソッドが存在します。しかし、メタプログラミング技術やフレームワークの内部機構によって動的に生成されるメソッドなので`alias`は使用できません。そのため、自分でメソッドを名前を変更するメソッドを作成します。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
class << self
def focb(*args, &block)
find_or_create_by(*args, &block)
end
end
end
上記のように記述すると、以下の実行結果は同じになります。
# Railsコンソール
pry(main)> User.find_or_create_by(name: '試験太郎')
pry(main)> User.focb(name: '試験太郎')
以上