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 ) }
它将创建实例变量并使用相应的状态初始化您的实例变量。