哪种做法最好,并且给我带来更好的表现?
例如:
我有状态表,有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"}
还是其他任何好方法?
答案 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 ) }
它将创建实例变量并使用各自的状态初始化您的实例变量。