3

使用 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
  1. Method 1执行需要 30ms;Method 2执行需要 400 毫秒。有什么理由吗?

  2. 我更喜欢,因为我可以从URL 而不是 URLMethod 2获取更多数据,但它存在性能问题。photo我该如何解决这个问题?

4

1 回答 1

0

正如 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]      
于 2013-08-12T16:44:14.230 回答