这个示例代码是正确的,没有错误,但是这很好,只有当你只有几百或上千个数据,但是如果你有一百万次查询,这需要时间来改进这个算法。
namespace :auto_status do
desc "Add Status to the Tracking code Automaticaly"
task make_status: :environment do
@product_trackers = ProductTracker.all
@statuses = Status.all
@date = DateTime.now.utc
@product_trackers.each do |product_tracker|
if (Status.where(product_tracker_id: product_tracker.id).count == 1 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 1)
@links = Status.new
@links.order_status = 1
@links.product_tracker_id = product_tracker.id
@links.save
elsif (Status.where(product_tracker_id: product_tracker.id).count == 2 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 2)
@links = Status.new
@links.order_status = 2
@links.product_tracker_id = product_tracker.id
@links.save
elsif (Status.where(product_tracker_id: product_tracker.id).count == 3 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 5)
@links = Status.new
@links.order_status = 3
@links.product_tracker_id = product_tracker.id
@links.save
elsif (Status.where(product_tracker_id: product_tracker.id).count == 4 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 6)
@links = Status.new
@links.order_status = 4
@links.product_tracker_id = product_tracker.id
@links.save
end
end
end
end
发布于 2016-12-07 12:03:47
您有大量的代码重复,其中一个重要的规则是“不重复”(不要重复自己),请检查以下内容,我所做的只是干燥代码:
namespace :auto_status do
desc "Add Status to the Tracking code Automaticaly"
task make_status: :environment do
ProductTracker.select(:id).find_each do |product_tracker|
status = Status.where(product_tracker_id: product_tracker.id)
count = status.count
next if count == 0
days_diff = ((Time.parse(DateTime.now.to_s) - Time.parse(status.first.created_at.to_s))/1.days).round
if ( (count == 1 && days_diff == 1) ||
(count == 2 && days_diff == 2) ||
(count == 3 && days_diff == 5) ||
(count == 4 && days_diff == 6) ){
Status.create(product_tracker_id: product_tracker.id, order_status: count)
}
end
end
end
请注意这里
find_each
时,如果您有许多会破坏内存的ProductTracker
,则find_each
将将它们批量加载。ProductTracker
中选择惟一需要的id。https://codereview.stackexchange.com/questions/149183
复制相似问题