2013-07-06 37 views
2

这是最好的做法,并给我更好的性能?rails3 - 这是更好的性能代码

例如:

我有状态表,它有5个记录,每个记录必须在单独的变量存储。

方法一:

@new_status = Status.find_by_status("NEW") 
@inprocess_status = Status.find_by_status("InProcess") 
@completed_status = Status.find_by_status("Completed") 
@occupied_status = Status.find_by_status("Occupied") 
@success_status = Status.find_by_status("Success") 

方法2:

statuses = Status.all 
@new_status = statuses.find {|status| status.status == "NEW"} 
@inprocess_status = statuses.find {|status| status.status == "InProcess"} 
@completed_status = statuses.find {|status| status.status == "Completed"} 
@occupied_status = statuses.find {|status| status.status == "Occupied"} 
@success_status = statuses.find {|status| status.status == "Success"} 

或者任何其它的好办法?

回答

1

如果有500万条记录,方法1应该更好,因为数据库查询具有更好的性能。

如果只有5条记录,方法2更好,因为只有一条数据库查询。方法1有5个查询,这对于少量记录非常耗时。

1

你只有5条记录,所以5个数据库查询将非常昂贵,根本不是一个好的做法。

您可以在内存中获取它们并分配给实例变量。但我可以看到Method2中的对称性,它看起来像非常对称的代码。

Status.all.each{|status| instance_variable_set("@#{status.name.downcase}_status" , status) } 

它将创建实例变量,并与相应的状态初始化的实例变量:我强烈建议不要在ruby写对称的代码,你可以用类似修改。

2

这将更加高效,因为它只对db进行一次查询,并且只获取必要数量的数据。这是假设status字段是唯一的。

statuses = Status.where(
    status: ['NEW', 'InProcess', 'Completed', 'Occupied', 'Success'] 
).order(:status) 

@new_status, @completed_status, @inprocess_status, @occupied_status, @success_status = statuses 
+0

是不是要将“状态”的最低值记录分配给/ @ new_status,次低的记录分配给/ @ completed_status等?我想你可能不得不重新排列最后一行。我可能只是检查状态的数量,以确保找到五个。 –

+0

'order(:status)'将确保它们的顺序是正确的(它应该按字母顺序升序)。是的,我在我的代码中做了一些假设,例如,状态是唯一的,这些状态将存在。目的不是为了展示一个傻瓜式的例子,其目的是为OP的问题提供另一种更有效的替代方案。 – gylaz