Ruby on rails Rails渲染视图的速度非常慢

Ruby on rails Rails渲染视图的速度非常慢,ruby-on-rails,ruby,Ruby On Rails,Ruby,我对Rails还是个新手,在一个实践项目实验室工作,遇到了一个视图渲染速度非常慢的问题。 任何和所有的帮助将不胜感激 我也收到了这个错误: SystemStackError (stack level too deep): app/models/blogger.rb:23:in `popular_post' app/views/bloggers/show.html.erb:13:in `_app_views_bloggers_show_html_erb__247812415140953454

我对Rails还是个新手,在一个实践项目实验室工作,遇到了一个视图渲染速度非常慢的问题。 任何和所有的帮助将不胜感激

我也收到了这个错误:

SystemStackError (stack level too deep):
  
app/models/blogger.rb:23:in `popular_post'
app/views/bloggers/show.html.erb:13:in `_app_views_bloggers_show_html_erb__247812415140953454_70240453389320'
Gemfile

gem 'rails', '~> 5.1.6'
gem 'sqlite3'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'faker'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

<h1> <%= @blogger.name %> </h1>

<br />
<p> Age: <%= @blogger.age %> </p>
<br />
<br />
<p> Bio: <%= @blogger.bio %> </p>
<br />


<br />

<%= link_to @blogger.popular_post.title, post_path(@blogger.popular_post) %>

<br />
<%= @blogger.top_five %>
gem'rails',“~>5.1.6”
gem'sqlite3'
宝石“彪马”,“大于3.7”
gem'sass-rails',“~>5.0”
gem'uglifier','>=1.3.0'
宝石“冒牌货”
gem“咖啡轨”,“~>4.2”
gem“涡轮链接”,“大于5”
gem'jbuilder',“~>2.5”
小组:开发,:测试
gem'byebug',平台:[:mri,:mingw,:x64_mingw]
宝石“水豚”,“大于2.13”
gem“selenium webdriver”
结束
小组:发展怎么办
gem“web控制台”,“>=3.3.0”
gem'listen','>=3.0.5','<3.2'
宝石“春天”
gem‘SpringWatcherListen’,“~>2.0.0”
结束
gem'tzinfo data',平台:[:mingw,:mswin,:x64_mingw,:jruby]
我的类是Blogger、Destination和Post(
Blogger--Destination
)。下面是Blogger模型、show page和controller的代码(除了Blogger索引之外,我还没有编写其他任何代码,但可以工作,只是一个列表)

blogger.rb

class Blogger < ApplicationRecord
    has_many :destinations
    has_many :posts, through: :destinations
    validates :name, uniqueness: true
    validates :age, numericality: { greater_than: 0, message: ": You're Too Young" }
    validates :bio, length: { :minimum => 30 }

    def self.average_age
        ages = self.all.sum do |blogger|
            blogger.age
        end
        (ages / self.all.count)
    end

    def total_likes
        self.posts.sum do |post|
            post.likes
        end
    end

    def popular_post
        self.posts.max_by do |a|
            a.likes
        end
    end

    def top_five
        self.destinations.sort_by do |destination|
            destination.post_count
        end.take(5)
    end
end
class Blogger30}
def自我平均年龄
ages=self.all.sum do | blogger|
blogger.age
结束
(年龄/自我。全部。计数)
结束
def total_喜欢什么
self.posts.sum do| post|
波斯特喜欢
结束
结束
def popular_post
self.posts.max_by do|a|
a、 喜欢
结束
结束
def前五名
self.destinations.sort_by do|destination|
目的地邮政编码
结束。采取(5)
结束
结束
博客展示页面

gem 'rails', '~> 5.1.6'
gem 'sqlite3'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'faker'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

<h1> <%= @blogger.name %> </h1>

<br />
<p> Age: <%= @blogger.age %> </p>
<br />
<br />
<p> Bio: <%= @blogger.bio %> </p>
<br />


<br />

<%= link_to @blogger.popular_post.title, post_path(@blogger.popular_post) %>

<br />
<%= @blogger.top_five %>


年龄:



生物:




博客控制器

class BloggersController < ApplicationController
   
    def index
        @bloggers = Blogger.all
    end

    def show
        @blogger = Blogger.find(params[:id])
    end
    

    def new
        @blogger = Blogger.new
    end

    def create
        @blogger = Blogger.create(blogger_params) 
        if @blogger.valid?
            @blogger.save
            redirect_to blogger_path(@blogger)
        else
            flash[:my_errors] = @blogger.errors.full_messages
            redirect_to new_blogger_path
            # render :new
        end
    end
    
    private

    def blogger_params
        params.require(:blogger).permit(:name, :bio, :age)
    end
    
    
    
end
class BloggersController
我认为您需要修改此方法

def popular_post
        self.posts.max_by do |a|
            a.likes
        end
    end
max_by
是一个可枚举类的方法,您可以在Post类上调用它,因此这将无法正常工作。我建议您使用类似于
posts.order('likes DESC')的内容。首先,如果
likes
是整数,则使用
likes


还有一个小提示,您不需要在对象和类方法中使用所有这些
self
。Rails会假设,如果这是一个对象方法,您可以在对象上调用它;如果这是一个类方法,您可以在关系上调用它。

这些方法
total\u likes
popular\u post
top\u five
都是通过假设您的关联是“数组”(枚举)来工作的。虽然这是可行的,但对于较小的示例来说,它的优化程度较低。因为处理数组还需要首先从数据库加载完整的数组,然后在完整的集合(内存中)上本地执行计算。数据库最适合执行此类任务(查询)

例如,
top_five
可以更好地写入数据库进行排序,然后只首先获取5个(最流行的)

(这是假设
:post_count
是数据库中的实际字段

同样,我们可以改进其他方法:

def total_likes
  posts.sum(:likes)
end
只需使用数据库:这将启动一个查询,返回该博客所有帖子的赞数

def popular_post
  posts.order(likes: :desc).limit(1).first
end
我们按降序排序,然后选择第一个。限制1告诉我们只想检索一个项目,但这仍然返回一个数组,所以我们想要第一个返回的项目


这应该可以提高您的性能。

您也可以显示post.rb吗?它是“非常慢”,还是“根本不显示,因为它会引发
SystemStackError
”?您没有向我们显示完整的堆栈跟踪(特别是,哪个部分卡在递归循环中并导致堆栈溢出??),也没有显示完整的代码(特别是,
post.rb
?),因此很难猜测问题的根本原因。要解决此问题,您可能需要了解此错误的实际含义。此错误是由对某个方法的递归调用导致的,而该方法并未停止被调用。请查看。您需要找出导致此错误的方法。错误消息显示它从方法popular_post中blogger.rb中的第23行。在这里调用a.likes,其中a是post对象。所以我想您需要看看post类中的likes方法。