2

有没有办法在 Rails 中做到这一点:我有一个 activerecord 查询

@posts = Post.find_by_id(10)

每次调用查询时,都会在数据库中生成并执行 SQL,如下所示

SELECT * FROM 'posts' WHERE id = 10

每次执行 AR 查询时都会发生这种情况。类似这样的辅助方法

<%= f.textarea :name => 'foo' %> 
#=> <input type='textarea' name='foo' />

我编写了一些 Railsy 代码来生成一些其他系统(数据库、Web 浏览器)使用的文本。我想知道是否有办法编写 AR 查询或辅助方法调用来生成文件中的文本。这样文本渲染只完成一次(每次代码更改时)而不是每次调用方法时?

4

3 回答 3

1

看看这行,它可能会去数据库的第一个,但之后它可能会在行的开头说 CACHE,这意味着它将去 ActiveRecord 的查询缓存。

在我看来,您还想缓存页面,而不是查询。即使是查询,我也不认为它那么简单find_by_id(10):)

于 2009-11-11T20:43:27.060 回答
0

我不确定我是否完全理解你的问题。

如果您询问生成的查询,find_by_sql如果您不想使用活动记录动态方法,则可以编写自己的 SQL。

如果您要询问将结果集缓存到文件中,它已经在数据库中,我不知道如果它在文件中它会更有效率。

于 2009-11-11T20:09:20.640 回答
0

就像 Radar 建议的那样,您可能应该研究 Rails 缓存。您可以从内存存储或文件缓存之类的简单事物开始,然后在必要时转向更好的事物,例如 memcached。您可以在辅助方法中加入一些缓存,该方法将在查询一次后缓存结果。因此,例如,您可以这样做:

    id = 10 # id is probably coming in as a param/argument
    cache_key = "Post/#{id}"
    @post = Rails.cache.read(cache_key)
    if @post.nil?
      @post = Post.find_by_id(id)
      # Write back to the cache for the next time
      Rails.cache.write(cache_key,@post)
    end

剩下要做的唯一另一件事是在帖子更改时放入一些代码以使缓存条目过期。为此,请查看在 Rails 中使用“Sweepers”。或者,您可以查看一些缓存 gem,例如 Cache-fu 和 Cached-model。

于 2009-11-15T23:58:25.660 回答