1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

model内のインスタンスメソッドの中でインスタンスの属性値を取得する

Posted at

経緯

  • 自分が書いた過去のコード(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で属性値を取得できます。(こういう書き方って、あんまり載ってない気がするのですが。。。)
game.rb
  def get_gameset_msg
    self.gameset_flag ? "試合終了" : "試合中"
  end
  • 属性名を動的に生成する場合
    • イニングごとの得点を合計した値が欲しい場合などは、動的にカラム名を生成することでコード量を減らせますが、この場合はハッシュのvalueを取得するように書きます。self.xxxのようには書けません。
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

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?