1

我有一个具有_and_belongs_to_many 美食的商店模型。这是控制器操作和编辑表单。

应用程序/控制器/shops_controller.rb

class ShopsController < ApplicationController
  def edit
    @shop = Shop.where(id: params[:id]).first
    @cuisines = Cuisine.asc(:name)
  end
end

应用程序/视图/商店/edit.html.haml

= simple_nested_form_for @shop do |f|
  .control-group
    .control-label
      = f.link_to_add 'Cuisine', :cuisines
    .controls
      = f.fields_for :cuisines do |cuisine|
        = cuisine.input :id, label: false, collection: @cuisines
        = link_to t_action(:remove)

问题是@cuisines 被评估的次数与商店的菜肴数量一样多。第一次执行后,它不会缓存查询。

在搜索并尝试了不同的解决方案以减少查询后,我只能发现使用以下任何一种方法都会有所帮助。

@cuisines = Cuisine.asc(:name).to_a

或者

@cuisines = Cuisine.asc(:name).entries

或者

@cuisines = Cuisine.asc(:name).cache

有人可以建议我做自动缓存之类的其他选择吗?

4

1 回答 1

0

Mongo 缓存查询使用的文档并将它们保存在 RAM 中的工作集中:

http://docs.mongodb.org/manual/faq/storage/#what-is-the-working-set

而如果您想缓存特定查询的结果,您可以通过创建不同的集合(例如美食缓存)自己完成,并将查询结果存储在其中。对于每次查找,首先在缓存中查找,如果在缓存中找不到,则执行实际查询并将其存储在缓存中以供下次访问。您可能还想使缓存过期,您可以使用 TTL:

http://docs.mongodb.org/manual/tutorial/expire-data/

可以将 TTL 设置为“x”分钟,如果再次访问数据,将 TTL 重新设置为“x”,这样文档只有在 x 分钟未访问时才会被删除;或者,如果您的数据在 y 分钟后发生显着变化,您可以将硬限制设置为“y”。只是分享一些方法,您将需要根据您的要求建立实际的实现。

于 2013-09-11T13:23:30.503 回答