今回はオリジナルアプリを作っている際数字で登録するところをうっかり大文字数字で記入しても勝手に半角数字にしちゃうメソッドを作ったのでまとめたいと思います。
投稿の際に使用するテーブルはこんな感じです。
mysql> show columns from sakes;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| rice_rate | varchar(255) | NO | | NULL | |
| sake_degree | varchar(255) | NO | | NULL | |
| type_id | int(11) | NO | | NULL | |
| degree | int(11) | NO | | NULL | |
| company | varchar(255) | NO | | NULL | |
| rice | varchar(255) | YES | | NULL | |
| user_id | bigint(20) | NO | MUL | NULL | |
| created_at | datetime(6) | NO | | NULL | |
| updated_at | datetime(6) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
11 rows in set (0.01 sec)
この中にdegree(アルコール度数)の部分を投稿の際i int型にするためにモデルにメソッドを作ります。
def degree=(value)
value.tr!('0-9', '0-9') if value.is_a?(String)
super(value)
end
まず最初のdegree=(value)はメソッドの定義で何か代入しているように見えるがdefree= と言うメソッドに仮引数(value)が設定されている形となる。
まず大文字でも胃が入力された時はstringになるのでis_a?メソッドが真の場合処理が行われます。
trメソッドの公式リファレンスを見てみると、、
pattern 文字列に含まれる文字を検索し、それを replace 文字列の対応する文字に置き換えます。
例はこんな感じです。
p "foo".tr("f", "X") # => "Xoo"
p "foo".tr('a-z', 'A-Z') # => "FOO"
p "FOO".tr('A-Z', 'a-z') # => "foo"
# シーザー暗号の復号
p "ORYV".tr("A-Z", "D-ZA-C") # => "RUBY"
# 全角英数字といくつかの記号の半角化
email = "ruby−lang@example.com"
p email.tr("0-9a-zA-Z.@−", "0-9a-zA-Z.@-")
# => "ruby-lang@example.com"
ざっくり言うと第一引数の内容を第二引数に変更するといった感じです。
なのでtrメソッドで内容を変更しています。
これで変わると思ったがエラー。。。
super(value)の記述を付け加えて無事できました。
今までなんとなくで触っていましたがカラムはメソッドとして使用できるということをわかっていませんでした。
最後の super(value)の親クラスはActiveRecord::Baseとなります。
ここらへんのことはまだふわっとしているので次の記事でまとめたいと思います。