gpt4 book ai didi

ruby-on-rails - 清理 Controller 以加速应用程序

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:12 25 4
gpt4 key购买 nike

所以在我的应用程序中,我在整体布局中使用了通知和不同的记录计数,因此每个页面都需要它们。

目前在我的 application_controller 中我有很多这样的东西:

@status_al = Status.find_by_name("Alive")
@status_de = Status.find_by_name("Dead")
@status_sus = Status.find_by_name("Suspended")
@status_hid = Status.find_by_name("Hidden")
@status_arc = Status.find_by_name("Archived")
@balloon_active = Post.where(:user_id => current_user.id, :status_id => @status_al.id )
@balloon_dependent = Post.where(:user_id => current_user.id, :status_id => @status_de.id )
@balloon_upcoming = Post.where(:user_id => current_user.id, :status_id => @status_sus.id )
@balloon_deferred = Post.where(:user_id => current_user.id, :status_id => @status_hid.id )
@balloon_complete = Post.where(:user_id => current_user.id, :status_id => @status_arc.id )

..那真的只是一小部分,我用类似的电话至少加倍了。问题是我几乎在每一页上都需要这些数字,但我觉得我在这里对 DB wayyyy 的访问次数太多了。

对于更好的实现有什么想法吗?

最佳答案

范围

首先,您应该将它们中的许多移动到 scopes 中,这将允许您以更灵活的方式使用它们,例如使用 ActiveRecord 链接查询。参见 http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html .

索引

其次,如果您无论如何都要进行所有这些查询,请确保您索引您的数据库,例如,通过名称快速查找Status。完成第一个索引的示例迁移:

add_index :status (or the name of your Status controller), :name

session

如果您在这里需要的数据并不重要,即您不需要依赖它来进行进一步的计算或数据库更新,您可以考虑将其中的一些数据存储在用户的 session 中。如果这样做,您以后可以简单地从 session 中读取您需要的任何内容,而不是在每次页面加载时都访问您的数据库。

如果此数据很关键和/或必须更新到秒,则避免此选项。

计数器缓存

如果您需要定期对某些记录进行计数,请考虑设置一个counter_cache。基本上,在您的模型中,您执行以下操作:

Parent.rb
has_many :children

Child.rb
belongs_to :parent, :counter_cache => true

确保您的 parent 表有一个名为 child_count 的字段,Rails 会在每个子项的创建/删除时为您更新此字段。如果您使用 counter_caching,您将避免访问数据库来获取计数。

注意:使用 counter_caching 会导致创建和销毁操作稍长,但如果您经常使用这些计数,通常值得使用 counter_cache。

关于ruby-on-rails - 清理 Controller 以加速应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083852/

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