gpt4 book ai didi

sql - Rails 事件记录 : How to reduce number of trips to database?

转载 作者:行者123 更新时间:2023-12-04 20:33:14 25 4
gpt4 key购买 nike

在我的 Rails 项目中,我有一个功能可以向用户显示他们的 Facebook 好友是否已经在该网站上。验证后,我将他们的 facebook 好友加载到@fb_friends,然后执行此操作:

  @fb_friends.each do |friend|
friend_find = Authorization.find_by_uid_and_provider(friend[:identifier], 'facebook')
if friend_find
@fb_friends_on_cody << friend_find.user_id
@fb_friends.delete(friend)
end
end

基本上,如果找到匹配项(通过授权表),我将该记录推送到@fb_friends_on_cody。这被证明是一个非常昂贵的操作:

  1. 这会为每个 friend 访问一次数据库。所以在我的例子中,总共执行了 582 个查询。

  2. 每个 Authorization.find_by_uid_and_provider 的性能都很差。我已经添加了这样的索引:

    add_index "authorizations", ["uid", "provider"], :name => "index_authorizations_on_uid_and_provider", :unique => true

我想通过解决第一点可以看到很多性能提升。也许有一些方法可以使查询本身更有效率。感谢这些方面的任何提示。

解决方案

使用 Unixmonkey 的指导,我能够将查询数量从 582 减少到 1!这是最终代码:

  friend_ids = @fb_friends.map{|f| f[:identifier] }
authorizations = Authorization.where('provider = ? AND uid IN (?)','facebook',friend_ids)
@fb_friends_on_cody = authorizations.map{ |a| { user_id: a.user_id, uid: a.uid }}
@fb_friends.reject!{|f| @fb_friends_on_cody.map{|f| f[:uid]}.include?(f[:identifier]) }

最佳答案

我觉得应该可以

friend_ids = @fb_friends.map(&:id)
authorizations = Authorization.where('provider = ? AND uid IN (?)','facebook',friend_ids)
@fb_friends_on_cody = authorizations.map(&:user_id)
@fb_friends.delete_all('id in (?)', @fb_friends_on_cody)

关于sql - Rails 事件记录 : How to reduce number of trips to database?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11676760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com