Ruby on rails 会不会有很多:通过在RoR中施加巨大的性能影响? 我们考虑下面的关系(3个模型): 类作者:作者 结束 课堂论文:destroy 拥有多个:作者,:至=>:作者身份 接受:authorships、:allow\u destroy=>true的\u嵌套\u属性 结束 类作者身份

Ruby on rails 会不会有很多:通过在RoR中施加巨大的性能影响? 我们考虑下面的关系(3个模型): 类作者:作者 结束 课堂论文:destroy 拥有多个:作者,:至=>:作者身份 接受:authorships、:allow\u destroy=>true的\u嵌套\u属性 结束 类作者身份,ruby-on-rails,Ruby On Rails,如您所见,我使用了很多has\u many,也使用了:至。当我浏览基本上显示所有论文和相应作者的paper.html.erb页面时,它会大大降低系统的速度。现在我有大约400篇论文和2000位作者,加载页面需要3秒钟,另外,从日志中我看到RoR进行了很多SQL查询,大多数查询都是为了检索作者。我想知道这是RoR中的典型现象。谢谢你的帮助。这听起来更像是一个优化问题。为了回答你最初的问题,有很多:通过本身并不会造成任何明显的差异。如果只有两个表用于论文和作者,则会出现完全相同的问题 根据您报告的日

如您所见,我使用了很多
has\u many
,也使用了
:至
。当我浏览基本上显示所有论文和相应作者的
paper.html.erb
页面时,它会大大降低系统的速度。现在我有大约400篇论文和2000位作者,加载页面需要3秒钟,另外,从日志中我看到RoR进行了很多SQL查询,大多数查询都是为了检索作者。我想知道这是RoR中的典型现象。谢谢你的帮助。

这听起来更像是一个优化问题。为了回答你最初的问题,有很多:通过本身并不会造成任何明显的差异。如果只有两个表用于
论文
作者
,则会出现完全相同的问题

根据您报告的日志,我假设您的代码如下所示:

# Controller:
@papers = Paper.all

# View:
<% @papers.each do |paper| %>
    <%= paper.authors.join(', ') %>
    <%# other code... %>
<% end %>
#控制器:
@纸
#视图:
rails所做的是每次调用
paper.authors
,它都会运行一个查询来获取与该论文相关联的作者。如果您有400篇论文,rails将运行400个查询。这称为n+1查询问题,其中对每个记录运行n个查询,以及获取初始记录的第一个查询。Rails对如何解决此问题提供了很好的指导:

基本上,您希望避免在每次获取论文作者时运行查询。您可以改为在控制器中加载论文,如下所示:
@papers=Paper.includes(:author).all
。这将加载所有论文及其关联作者,并且只运行2个查询:一个用于所有论文,另一个用于与这些论文关联的所有作者


但是,要小心过度使用
.includes
,因为一旦记录太多,它也会减慢加载时间。Rails还需要时间在内存中创建每个
文件
和每个
作者
对象;它目前将根据您的数据库记录创建2400个对象。当你获得一定数量的记录后,你应该考虑添加分页或搜索功能,而不是在一个页面上加载成千上万条记录。

你也可以发布你的控制器和查看代码吗?我想你的意思是:作者,但是的,这会大大加快速度!
# Controller:
@papers = Paper.all

# View:
<% @papers.each do |paper| %>
    <%= paper.authors.join(', ') %>
    <%# other code... %>
<% end %>