経緯
- 自分が書いた過去のコード(Ruby書き始めだった頃のもの)を見ていると、「今はとりあえずこのようにしか書けないけど、本当はもっとよりよく書けるはずだ」と思っていた部分が目に入ったので、直します。
- 表題の件について、誰か同じように詰まった方の参考になれればいいのですが。。。
修正前
- 以下のようなコードです。しかしすごい書き方していますね。。。
game.rb
def get_gameset_msg
gameset_msg = "試合中"
if self[:gameset_flag]
gameset_msg = "試合終了"
end
return gameset_msg
end
修正後
- カラム名は修正していませんが、「gameset_flag」は「is_gameset」とかの方がいいんでしょうか。。。
game.rb
def get_gameset_msg
self.gameset_flag ? "試合終了" : "試合中"
end
ポイント
- 基本的な取得方法(修正後と同じコード)
- model内のインスタンスメソッドの中では、selfでインスタンス本体を指します。
self.xxx
で属性値を取得できます。(こういう書き方って、あんまり載ってない気がするのですが。。。)
- model内のインスタンスメソッドの中では、selfでインスタンス本体を指します。
game.rb
def get_gameset_msg
self.gameset_flag ? "試合終了" : "試合中"
end
- 属性名を動的に生成する場合
- イニングごとの得点を合計した値が欲しい場合などは、動的にカラム名を生成することでコード量を減らせますが、この場合はハッシュのvalueを取得するように書きます。
self.xxx
のようには書けません。
- イニングごとの得点を合計した値が欲しい場合などは、動的にカラム名を生成することでコード量を減らせますが、この場合はハッシュのvalueを取得するように書きます。
game.rb
def get_sum_top
sum_top = 0
9.times {|n|
str_top = "top" << (n + 1).to_s
sum_top += self[str_top].to_i
}
sum_top
end
- 属性名を動的に生成する場合(その2)
- 上記のコードは、以下のように
send
メソッドを使って書くこともできます。メソッド名を文字列で指定して実行する場合に使えるメソッドです。ただ、今回のような場合は上記のようにself[str_top]
の方が短くていいですかね。
- 上記のコードは、以下のように
game.rb
def get_sum_top
sum_top = 0
15.times {|n|
str_top = "top" << (n + 1).to_s
sum_top += self.send(str_top).to_i
}
sum_top
end