gpt4 book ai didi

ruby-on-rails - 在哪里修补Rails ActiveRecord::find()以便首先检查内存中的集合?

转载 作者:行者123 更新时间:2023-12-03 22:40:54 24 4
gpt4 key购买 nike

由于某种复杂的原因,我想创建类似以下内容的东西:

# Controller:
@comments = @page.comments # comments are threaded
# child comments still belong to @page
...
# View:

@comments.each_root {
display @comment {
indent & recurse on @comment.children
} }

# alternatives for how recursion call might work:

# first searches @comments, then actually goes to SQL
comment.in_memory.children

# only looks at @comments, RecordNotFound if not there
# better if we know @comments is complete, and checking for nonexistent
# records would be wasteful
comment.in_memory(:only).children

# the real thing - goes all the way to DB even though target is already in RAM
# ... but there's no way for find() to realize that :(
comment.children


我什至不确定这是否可行,更不用说一个好主意了,但是我很好奇,这会有所帮助。

基本上,我想使用诸如 @collection.find{|item| item.matches_finder_sql(...)}之类的方法重定向find(),使其首先/仅在已加载的集合中查找。

关键是要防止不必要的复杂缓存和昂贵的数据库查找,而这些查找已经被大量加载。

如果可能的话,如果它与现存的过时机制,关联延迟加载等一起发挥良好的作用,那就太好了。

嵌套注释只是一个例子。当然,这也适用于许多其他情况。

所以...我该怎么做?

最佳答案

您不应该编写Rails本身已经存在的东西!您可以轻松利用Rails的缓存方法将查询结果放入Memcached(或您配置的缓存框架)中:

class ArticleController < ApplicationController 
def index
@articles = Rails.cache(:articles_with_comments, :expires_in => 30.minutes) do
Article.find(:all, :include => :comments)
end
end
end


顺便说一句。 :expires_in是可选的。您可以将缓存“永久”保留或手动将其过期。

根据我的评论,第二个例子:

class ArticleController < ApplicationController 
def index
@page = Page.find(params[:page_id]

@articles = Rails.cache([:articles_with_comments, @page.id], :expires_in => 30.minutes) do
Article.find(:all, :include => :comments, :conditions => { :page_id => @page.id})
end
end
end


这将为给定的 @page对象缓存文章和评论。

关于ruby-on-rails - 在哪里修补Rails ActiveRecord::find()以便首先检查内存中的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1515856/

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