【问题标题】:Dynamic variable names in RubyRuby 中的动态变量名
【发布时间】:2014-06-10 17:25:26
【问题描述】:
@baseball_games = 0
@basketball_games = 0
@football_games = 0

Game.all.each do |game|
  instance_variable_set("@#{game.sport.name.downcase}_games", instance_variable_get("@#{game.sport.name.downcase}_games") + 1)
end

有没有比在 set 方法中调用 get 方法更好的方法呢?我真的只是想+=动态变量...

【问题讨论】:

  • 闻起来像糟糕的设计。实现[]=怎么样?
  • 对,把它们存储在一个哈希中
  • 啊啊啊啊啊。 games = {basketball: 0, football: 0, baseball: 0},然后是games[game.sport.name.downcase] += 1

标签: ruby variables dynamic


【解决方案1】:
@games = {:baseball => 0, :basketball => 0, :football => 0 }
Game.all.each do |game|
  @games[game.sport.name.downcase.to_sym] = @games[game.sport.name.downcase.to_sym] + 1
end

【讨论】:

    【解决方案2】:

    另一种解决方案,没有循环(假设关系是运动 has_many 游戏)

    @games = {
      :baseball => Sport.find_by_name('baseball').games.count,
      :basketball => Sport.find_by_name('basketball').games.count,
      :football => Sport.find_by_name('football').games.count
    }
    

    【讨论】:

      【解决方案3】:

      根据@Santosh 的回答,您可以更一般地执行此操作:

      @games = Sport.all.map { |sport| [sport.name.to_sym, sport.games.count] }.to_h
      

      【讨论】:

      • 是的。但我想 OP 只想要他提到的 3 项运动。
      • 不,我喜欢。我不需要计数,但如果我们在路上添加更多运动,自动构建该哈希会很好。
      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2011-10-08
      • 2011-09-30
      • 2015-06-15
      • 2013-05-09
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多