rails3 - 这是更好的性能代码

时间:2013-07-06 13:00:47

标签: ruby-on-rails performance activerecord

哪种做法最好,并且给我带来更好的表现?

例如:

我有状态表,有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"}

还是其他任何好方法?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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