[英]How to easily iterate through methods containing number in their name in Ruby, or Rails?
在实现类似于Chadwick数据库的DBMS时,我遇到了许多类似如下的代码(如果您认为数据库设计本身是错误的,请参考上方的链接。)
self.away_lineup1_batter = player if player.id === away_lineup1_batter_id
self.away_lineup2_batter = player if player.id === away_lineup2_batter_id
self.away_lineup3_batter = player if player.id === away_lineup3_batter_id
self.away_lineup4_batter = player if player.id === away_lineup4_batter_id
self.away_lineup5_batter = player if player.id === away_lineup5_batter_id
self.away_lineup6_batter = player if player.id === away_lineup6_batter_id
self.away_lineup7_batter = player if player.id === away_lineup7_batter_id
self.away_lineup8_batter = player if player.id === away_lineup8_batter_id
self.away_lineup9_batter = player if player.id === away_lineup9_batter_id
要么
# Using jbuilder gem.
json.pos2_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos2_fielder}
end unless data.pos2_fielder.nil?
json.pos3_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos3_fielder}
end unless data.pos3_fielder.nil?
json.pos4_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos4_fielder}
end unless data.pos4_fielder.nil?
json.pos5_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos5_fielder}
end unless data.pos5_fielder.nil?
json.pos6_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos6_fielder}
end unless data.pos6_fielder.nil?
json.pos7_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos7_fielder}
end unless data.pos7_fielder.nil?
json.pos8_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos8_fielder}
end unless data.pos8_fielder.nil?
json.pos9_fielder do
json.partial! 'players/simple_hash', locals: {data: data.pos9_fielder}
end unless data.pos9_fielder.nil?
复制和粘贴9行代码并不是什么大问题,但我认为可以为此提供更好的解决方案。 有什么建议吗?
主要建议:在Ruby中使用数组和正确规范化的数据库表。 而不是在一个表中pos2_fielder
和pos3_fielder
...,您应该有一个带有position
属性的表。 (除了“坏”之外,我无法说出更具体的内容,因为我不知道您的数据库到底是什么样子)。
要回答字面问题:
1.upto(9) do |num|
if player.id === send(:"away_lineup#{num}_batter_id")
send(:"away_lineup#{num}_batter=", player)
end
end
怎么了
[1,2,3,4,5,6,7,8,9].each { |i| eval("self.away_lineup#{i}_batter = player if player.id === away_lineup#{i}_batter_id" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.