使用Ruby on Rails 3.2。我有以下方法迭代关联以查找是否存在照片:
# Method 1
def trip_photos
if (photos = trip_days.map(&:spots).flatten.map(&:photos).flatten.map)
photos.each do |photo|
photo.url(:picture_preview)
end
end
end
# >> ['picture_1.jpg', 'picture_2.jpg']
# Method 1 view
@object.trip_photos.each do |photo|
photo
end
# Method 2
def trip_photos
if (photos = trip_days.map(&:spots).flatten.map(&:photos).flatten.map)
photos.each do |photo|
photo
end
end
end
# >> [photo_object_1, photo_object_2]
# Method 2 view
@object.trip_photos.each do |photo|
photo.data.url(:picture_preview)
end
Method 1
需要30毫秒才能执行; Method 2
需要400毫秒才能执行。有什么理由吗?
我更希望Method 2
因为我可以从photo
获取更多数据而不仅仅是网址,但它存在性能问题。我该如何解决这个问题?
答案 0 :(得分:0)
正如Mr.Yoshiji所说,你可以重构你的请求,以尽量减少数据集的循环。
改进方法1&&方法2:您可以避免上一次map
和each
调用,只需将集合作为flatten
# Method 2
def trip_photos
if (photos = trip_days.map(&:spots).flatten.map(&:photos).flatten)
photos
end
end
# >> [photo_object_1, photo_object_2]