Ruby on rails rails3-哪种代码性能更好

Ruby on rails rails3-哪种代码性能更好,ruby-on-rails,performance,activerecord,Ruby On Rails,Performance,Activerecord,哪一个是最好的练习,给了我更好的表现 例如: 我有一个statuses表,其中有5条记录,每条记录需要存储在单独的变量中 方法1: @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_

哪一个是最好的练习,给了我更好的表现

例如:

我有一个statuses表,其中有5条记录,每条记录需要存储在单独的变量中

方法1:

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

还是其他好方法?

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


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

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


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

您只有5个记录,因此5个数据库查询将非常昂贵,这根本不是一个好的做法

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

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

它将创建实例变量,并使用各自的状态初始化实例变量。

您只有5条记录,因此5次数据库查询将非常昂贵,这根本不是一个好的做法

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

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

它将创建实例变量,并用各自的状态初始化实例变量。

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

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

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

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

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

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

这不是要将状态值最低的记录分配给/@new\u status,次低的记录分配给/@completed\u status,等等吗?我想你可能需要重新订购最后一行。我可能也会检查状态的计数,以确保找到五个。顺序:status将确保它们的顺序正确,应该按字母顺序升序。是的,我在代码中做了一些假设,比如状态是唯一的,并且这些状态将存在。这样做的目的不是为了展示一个傻瓜式的例子,而是为了提供另一种更有效的方法来解决OP的问题。这不是要将状态值最低的记录分配给/@new_status,第二低的记录分配给/@completed_status,等等吗?我想你可能需要重新订购最后一行。我可能也会检查状态的计数,以确保找到五个。顺序:status将确保它们的顺序正确,应该按字母顺序升序。是的,我在代码中做了一些假设,比如状态是唯一的,并且这些状态将存在。其目的不是展示一个傻瓜式的例子,而是提供另一个更有效的替代OP问题的方法。