在方法中使用索引值

时间:2015-02-06 18:04:48

标签: ruby-on-rails ruby loops

在我的Rails应用程序中,在模型中,我尝试在以下方法中使用循环索引x,而我无法弄清楚如何获取值:

def set_winners ## loops over 4 quarters
    1.upto(4) do |x|
        qtr_[x]_winner.winner = 1
        qtr_[x]_winner.save
    end
end

我会继续搜索,但我们将非常感谢任何帮助!

编辑:所以我想我无法做到!这是我尝试通过循环四次完全重构的原始方法:

def set_winners
       ## set all 4 quarter's winning squares
        home_qtr_1 = game.home_q1_score.to_s.split('').last.to_i
        away_qtr_1 = game.away_q1_score.to_s.split('').last.to_i
        qtr_1_winner = squares.where(xvalue:home_qtr_1, yvalue:away_qtr_1).first
        qtr_1_winner.winner = 1
        qtr_1_winner.save

        home_qtr_2 = game.home_q2_score.to_s.split('').last.to_i
        away_qtr_2 = game.away_q2_score.to_s.split('').last.to_i
        qtr_2_winner = squares.where(xvalue:home_qtr_2, yvalue:away_qtr_2).first
        qtr_2_winner.winner = 1
        qtr_2_winner.save

        home_qtr_3 = game.home_q3_score.to_s.split('').last.to_i
        away_qtr_3 = game.away_q3_score.to_s.split('').last.to_i
        qtr_3_winner = squares.where(xvalue:home_qtr_3, yvalue:away_qtr_3).first
        qtr_3_winner.winner = 1
        qtr_3_winner.save

        home_qtr_4 = game.home_q4_score.to_s.split('').last.to_i
        away_qtr_4 = game.away_q4_score.to_s.split('').last.to_i
        qtr_4_winner = squares.where(xvalue:home_qtr_4, yvalue:away_qtr_4).first
        qtr_4_winner.winner = 1
        qtr_4_winner.save
end

如果动态更改属性名称的不良做法,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

看起来你正试图用不支持它的语言做一个类似PHP的技巧,我们建议不要这样做,因为它导致代码由于动态命名变量而很难调试

看起来您想使用以下方法生成变量名称:

qtr_[x]_winner

创建类似的东西:

qtr_1_winner

相反,请考虑创建一个名为qtr_winner的数组,其中包含您的对象并访问以下元素:

qtr_winner[1]

qtr_winner[2]

你可以创建一个哈希来做类似的事情:

qtr_winner = {}
qtr_winner[1] = 5

然后使用qtr_winner[1]访问它并返回5或

qtr_winner[1].winner = 1

确定是使用散列还是数组是您是需要走容器还是需要随机访问。如果你总是使用一个值索引它,那么它可能是一个更快的清洗。

答案 1 :(得分:0)

根据您的修改,您不需要动态变量。循环中唯一改变的是game.home_qN_score,因此重构的重点应该是什么。鉴于此,这是一个可行的解决方案:

1.upto(4) do |i|
    home_qtr = game.send("home_q#{i}_score)".to_s.split('').last.to_i
    away_qtr = game.send("away_q#{i}_score)".to_s.split('').last.to_i
    winner = squares.where(xvalue:home_qtr, yvalue:away_qtr).first
    winner.winner = 1
    winner.save
end

原始答案:

如果qtr_1_winner等是实例方法,您可以使用Object#send来实现您的目标:

def set_winners ## loops over 4 quarters
  1.upto(4) do |x|
    send("qtr_#{x}_winner").winner = 1
    send("qtr_#{x}_winner").save
  end
end