简体   繁体   中英

How to easily iterate through methods containing number in their name in Ruby, or Rails?

While implementing a DBMS similar to Chadwick database , I'm encountering lots of similar codes like below (Please refer to the upper link if you think the database design itself is wrong.)

Setting values

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

or

Getting values

# 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?

Copying and pasting 9 rows of codes aren't really a big deal but I think there could be a better solution for this. Any suggestion?

The primary suggestion: use arrays in Ruby and properly normalised database tables. Instead of having pos2_fielder , pos3_fielder ... in one table, you should have a table with position property. (I can't say anything more specific as I do not know what your database looks like precisely, aside from "bad").

To answer the literal question:

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" }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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