1
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?

【Ruby,Rails】長いメソッド名をわかりやすい名前に変えて使用してみよう

Last updated at Posted at 2024-02-09

どうもこんにちは。

今回は、Ruby,Railsでメソッド名を自分のわかりやすい名前に変更して使用する方法を紹介します。

メソッド名を変更して使用する方法

大きく分けて2つです。

  1. aliasalias_methodを使用する
  2. 独自のメソッド名変更メソッドを用意する

ただし、aliasalias_methodは全てのメソッドに対して使用できる訳ではありません。
以下のメソッドに対してaliasalias_methodを使用することができます。

  1. 明示的に定義されたメソッド: クラス内で明示的に定義されたインスタンスメソッドやクラスメソッドには、通常、エイリアスを定義することができます
  2. 継承されたメソッド: スーパークラスから継承されたメソッドに対してもエイリアスを定義することが可能です

一方でaliasalias_methodを使用できないメソッドは以下のようなものです。

  1. 動的に生成されるメソッド: メタプログラミング技術やフレームワークの内部機構によって動的に生成されるメソッド。例えば、RailsのActiveRecordにおけるfind_by_*メソッドやfind_or_create_by_*メソッド
  2. 特殊なメソッドやキーワード: Rubyの一部の特殊なメソッド(例えば、initializemethod_missing)や、言語のキーワード(例えば、classdef

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 SilverRuby 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: '試験太郎')

以上

1
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
1
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?