Rails渲染视图的速度非常慢

如何解决Rails渲染视图的速度非常慢

我对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'

宝石文件

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]

我的课程是Blogger,目标和张贴(Blogger -< Post >- Destination)。下面是Blogger模型,显示页面和控制器的代码(除了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

blogger显示页面

<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 %>

blogger控制器

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

解决方法

我认为您需要修改此方法

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

max_by是Enumerable类的一种方法,您在Post类上调用它,因此它将无法正常工作。如果posts.order('likes DESC').first是整数,我建议您使用类似likes的东西。

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

,

方法total_likespopular_posttop_five都通过假设您的关联是“数组”(枚举)来工作。尽管这确实适用于较小的示例,但它并不是最佳的。因为处理数组还需要先从数据库中加载完整的数组,然后再在一个完整的集(在内存中)本地进行计算。数据库最适合执行此类任务(查询)。

例如,最好将top_five写入数据库以进行排序,然后仅获取前5个(最受欢迎)。

def top_five
  destinations.order(post_count: :desc).limit(5)
end 

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

类似地,我们可以改进其他方法:

def total_likes
  posts.sum(:likes)
end

仅使用数据库:这将启动一个查询,以返回博客作者所有帖子的喜欢总数。

def popular_post
  posts.order(likes: :desc).limit(1).first
end

我们按降序排序,然后选择第一个。 limit 1告诉我们只想检索一个项目,但是它仍然返回一个数组,因此我们要返回第一个项目。

这应该可以改善您的表现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-