【发布时间】:2014-09-09 19:26:18
【问题描述】:
我有一个 Ruby/Sinatra 应用程序,我在其中接收和解析图像的 JSON 字符串,例如:
[{"id" => "ABCD123", "type" => "image"},
{"id" => "ABCD234", "type" => "image"},
{"id" => "ABCD345", "type" => "image"},
{"id" => "ABCD456", "type" => "image"},
{"id" => "ABCD567", "type" => "image"}]
在数据库中,我有许多行存储图像的标题。目前,我有一个遍历数组并执行以下操作的函数:
app.rb
def get_caption(image_id)
caption = Images.find_by_image_id image_id
end
index.haml
-images.each do |image|
%div= get_caption(image['id'])
这似乎非常低效,因为该网站对每张图片进行了独特的查找,这肯定会增加页面的加载时间。
Images Load (131.6ms) SELECT "images".* FROM "images" WHERE "images"."image_id" = 'ABCD123' LIMIT 1
...
Images Load (131.6ms) SELECT "images".* FROM "images" WHERE "images"."image_id" = 'ABCD567' LIMIT 1
131.6ms * n 查询确实加起来很快(我希望在我们为生产进行优化时,这种缓慢的约 130 毫秒查找将得到改善,但也许这将是以后的另一个问题!)。
有没有更有效的方法来进行这种查找?以某种方式将caption 字段加入到数组中?
【问题讨论】:
-
而不是运行单独的查询,
where in (x,y,z,....)类型构造可能会有所帮助。在 image_id 字段上设置索引也会有所帮助。
标签: ruby postgresql activerecord sinatra