在我的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
如果动态更改属性名称的不良做法,有没有更好的方法呢?
答案 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