繁体   English   中英

如何在Ruby或Rails中轻松地迭代名称中包含数字的方法?

[英]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_fielderpos3_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM