gpt4 book ai didi

ruby-on-rails - Ruby on Rails : Is this the right way to structure code in Ruby on Rails? 这太慢了

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:07 26 4
gpt4 key购买 nike

我对 RoR 不是很熟悉,但我的同事已经为我们的一个应用程序编写了这段代码,我感觉这对于一个简单的任务来说未优化且查询太多。

我们有 3 张 table 。艺术家、专辑和歌曲。艺术家可以有多个专辑。专辑可以有多首歌曲。我们正在尝试根据 songs 表中的字段 popularity_total 输出前 10 首歌曲。然后还有其他表可以捕捉点赞等等。

def top
# a list of 10 most played songs in the past week
@toplistsongs = Song.select(INDEX_COLUMNS).order("popularity_total,created_at DESC").limit(10)
@toplistsongs.each do |song|
song['urls'] = song.get_song_urls
song['artist'] = song.get_song_artist
song['genre'] = song.tag_list
song['hearts'] = song.likers(User).count
song['like_status'] = ( current_user!=nil ? current_user.likes?(song) : false )
song['impressions'] = song.impressionist_count
song['albums'] = song.get_song_album
end

@w = {'top' =>
{
'song' => @toplistsongs
}
}
respond_with(@w)
end

循环内的每次提取都会导致数据库命中。我有一种感觉,每首歌的循环中发生了太多的查询,而理想情况下,它们都可以使用对所有歌曲的单个查询来完成。任何人都可以建议这是处理事情的标准 Rails 方式还是完全错误的代码?

感谢所有的帮助。

最佳答案

您可以使用 ActiveRecord includes方法以减少数据库查询次数。例如:

 @toplistsongs =  Song.select(INDEX_COLUMNS).order("popularity_total,created_at     DESC").limit(10).includes(:tags, { :songs => :artists }, :urls, :likers)

这将为整个 top 方法生成 5 个查询,并且不依赖于您要显示的歌曲数量。换句话说,查询的数量是常量

您必须使用 ActiveRecord 关联才能使其工作。我可以看到您正在使用方法 get_song_artist 我假设它不是由协会制作的。

ActiveRecord associations 中建立关系您将不得不使用 has_many、has_one 和 belongs_to 运算符。

关于ruby-on-rails - Ruby on Rails : Is this the right way to structure code in Ruby on Rails? 这太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12507418/

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