【发布时间】:2013-02-12 23:08:08
【问题描述】:
这是我的数据库查询:
User has_many UserFollow(UserFollow 是 User 模型之间的关系)。 用户 has_many 照片。 Photo has_many PhotoFollow 关系(PhotoFollow 是 User 和 Photo 模型之间的关系)。
@user_list = Array.new
user_followers = UserFollow.where("user_1_id = ?", current_user.id).includes(:follower)
user_followers.each do |f|
@user_list << f.user
end
photos = Photo.where("user_id = ?", current_user.id).includes(:follow_relationships => [:photo])
photos.each do |p|
p.follow_relationships.each do |f|
@user_list << f.user if !@user_list.include? f.user
end
end
if @user_list.size < 150
users = User.where("verified = ? and first_name IS NOT NULL and last_name IS NOT NULL", true).includes(:solutions).limit(150 - @user_list.size)
users.each do |u|
@user_list << u if !@user_list.include? u
end
end
显然,所有这些都需要大量的时间。使用包含有帮助,但我想知道是否有一些方法可以更有效地执行这组操作。
谢谢, 林哥
【问题讨论】:
-
我读错了吗?如果您希望合并这三个结果集,由于查询 3,这不是每个用户吗?
-
请看已编辑!是的 - 我确实想要每个用户,但我想要他们按照特定的顺序。我已决定将第 3 步限制为最多 200 个用户,但现在还有其他复杂情况(基本上是性能问题)
-
首先看看查询实际需要多长时间。那就是查看 Rails 发送到数据库的内容并尝试在没有 Rails 的情况下执行查询。我的猜测是您加载了所有这些对象,然后面临 N+1 选择问题。看看你是否可以创建一个真正的 SQL 查询来获得你想要的一切,看看它运行了多长时间。
标签: ruby-on-rails ruby-on-rails-3 rails-activerecord