Ruby on Rails:如果你的after_create操作中有50个if-else语句,那会降低你的应用程序的速度吗?

时间:2010-02-04 14:29:31

标签: ruby-on-rails ruby

对一个操作使用50个if-else语句是否过于耗费资源?

我正在做这样的事情:

if team.players.count > 1
   assign_team_type(..)
elsif team.players.count > 3
   assign_team_type(..)
...
etc.
...
end

此外,在控制器中的create action中放置50个if-else语句而不是after_create方法会更有效吗?或者使用case switch语句更有效率,还是完全避免使用它?

编辑:感谢您的快速回复!该代码用于社区体育锦标赛,根据该团队的球员数量分配球队。我正在尝试根据向该团队添加的玩家数量,为每个团队编写一个团队类型。因此,有1个玩家,3个玩家,5个玩家,7个玩家等的团队,最多200个玩家,总共需要50个if-else语句。

这些陈述发生在players_controller中,在用户访问http://localhost/players/new之后,添加了一个玩家,然后应用程序根据该团队当前有多少玩家决定分配他或她的团队的团队。它非常直接(一个基本的CRUD应用程序只需要这50个if-else语句)

models:

Team (has_many :players)
Player (belongs_to :team)

scaffold team name:string team_type:string
scaffold player team_id:integer name:string

这几乎就是它:)

6 个答案:

答案 0 :(得分:9)

您可以尝试将其重写为


assign_team_type(case team.players.count
                 when 2    then ...
                 when 3..5 then ...
                 else raise "Assignment failed"
                 end
)

这应该更快,因为team.players.count只评估一次。此外,它更清洁,更短。基准测试将有所帮助。

答案 1 :(得分:7)

呃,这是一个非常糟糕的代码味道。您可能会有一些重复的内容可以推送到模型中,或者至少可以汇总到其他内容中。

为什么不将它们放入数组或哈希?类似的东西:

TeamTypes = { 1 => something, 2 => something_else, .. }

assign_team_type( TeamTypes[team.players.count] )

答案 2 :(得分:3)

根据您的新信息,我建议在您的team_types模型中添加max_players列,并向模型询问以下内容:

find(:first, :conditions => ["max_players < ?", self.player_count], :order => "max_players ASC")

这使它完全动态,您可以通过Web界面管理团队类型分配。

答案 3 :(得分:2)

我的第一直觉是将您的数据打包成2D数组,如:

x=[[1, "arg 1"],
   [3, "arg 2"],
   [9, "arg 3"],
   ...
  ]

其中第一列是团队计数,第二列是您要传递给assign_team_type的参数。

您可以使用以下内容在表格中搜索您想要的参数:

func_arg = x.collect{|w| w[0] < team.players.count ? w[1] : nil}.compact.last
assign_team_type(func_arg)

我承认这是一种类似C的方法,但只需修改数组就可以动态更改分组参数。

答案 4 :(得分:1)

如何将每个函数分配给hash / dict?

d={1:assign_team_type(1),2:assign_team_type(2)}

答案 5 :(得分:0)

现代处理器能够进行“分支预测”

当有if-else要解析时,处理器将尝试猜测它需要哪一个,如果它猜错会导致你的app变慢。

我建议将任何过大的分支部分重构为漂亮的干净切换语句。