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

还是另外一个好方法?

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

 statuses = Status.where( status: ['NEW', 'InProcess', 'Completed', 'Occupied', 'Success'] ).order(:status) @new_status, @completed_status, @inprocess_status, @occupied_status, @success_status = statuses 

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

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

您只有5条记录,因此5个数据库查询将非常昂贵,完全不是一个好习惯。

您可以在内存中获取它们并分配给实例变量。 但我可以看到Method2的对称性,它看起来像非常对称的代码。 我强烈建议不要在ruby编写对称代码,你可以用以下代码修改它:

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

它将创建实例变量并使用相应的状态初始化您的实例变量。