【Rails】データベース上のデータをシンボルで取得

前置き

私はRails Tutorialを1周しただけの初心者ですから, いろいろツッコミどころがあるかもしれません. ご容赦くださいませ.

やりたいこと

たとえばボクサーのデータベースシステムを作るとします(ボクシング全然知りませんが...). データベースには名前(name)と階級(weight)を保存するものとします. テーブル例は以下の通りです.

id name weight
1 Muhammad Ali heavy
2 Shinsuke Yamanaka bantam

この場合, 取得される階級は文字列型ですね.

(irb) boxer = Boxer.first
(irb) boxer.weight #=> 'heavy'

しかしアプリケーション内において, 階級はシンボルで扱いたいとしましょう. つまり以下のような動作を実現させたいわけです.

(irb) boxer.weight #=> :heavy

実装

答えはわりと簡単です. アクセサメソッドを上書きすればいいのです.

class Boxer < ApplicationRecord

  def weight
    read_attribute(:weight).to_sym
  end
end

実はモデルにはread_attributeというメソッドが用意されています. これをつかってattributeを取得し, シンボルに変換しています.

最後に

そもそも階級と自然数を対応付けて, データベースには自然数を保存すればいいのかもしれませんね. 独自にモジュールやクラスを定義すれば, 上でやりたいことは実現できます.

さらにボクシングの階級は全順序集合ですから, 自然数との対応付けがより意味をなします. つまり階級順に取得したいときは, 自然数の自然な順序を利用すればいいということです.

なんだかまとまらない記事でお粗末様でございました.