Coldfusion Coldbox - 从查询中创建和缓存下拉选项

Coldfusion Coldbox - create and cache drop down options from queries

我正在寻找意见和替代想法,因为我正在做的是工作,但想问问它是否是最优的

我有一个站点,当索引处理程序被调用时,它会使用数据库表中的特定查询填充请求集合,以便我可以为用户构建下拉菜单 select。

我正在查询两个模型并将它们的结果放入各自的变量中,然后在视图中循环遍历它们以创建下拉列表

索引处理程序

function index(event, rc, prc){
    event.paramValue("debug",0);
    rc.stages  = getmodel("tms_proposal_stage").select();
    rc.plannedGiftTypes  = getmodel("tms_funding_type").select();
    event.setLayout('layout.bootstrap');
}

索引视图

  <div class="form-group">
    <label for="proposal_stage" class="control-label">Proposal Stage Code</label>
    <select id="proposal_stage" name="proposal_stage" class="form-control">
    <cfloop query="rc.stages">
        <option value="#stage_code#">#short_desc#</option>
    </cfloop>

    </select>
  </div>

我知道两个查询的成本并不高,但如果我需要 运行 其中 100 个,就会出现可伸缩性问题。这些查询结果集变化不大,所以我在想,这些是不是应该以不同的方式缓存或存储和访问?

我想到了html5本地存储,我用过但没有这方面的。 我还考虑制作一个新的处理函数,它进行所有这些数据库调用并被缓存,然后被其他函数引用

无论如何,所有想法都值得赞赏

您有多种选择。由于您使用的是 ColdBox,因此您可以随时使用 CacheBox。 https://github.com/ColdBox/cbox-refcards/raw/master/CacheBox/CacheBox-Refcard.pdf

一种非常简单的数据内联缓存方法是在组件顶部注入一个 CacheBox 提供程序:

component {
  property name="cache" inject="cachebox:default";
}

然后在您的事件中使用缓存 API 来存储和检索数据。我最喜欢的方法是 getOrSet(),因为它将它包装在一次调用中。

rc.stages = cache.getOrSet(
  objectKey="stages",
  produce=function(){ 
    return getmodel("tms_proposal_stage").select();
  }
);

仅当密钥不在缓存中时才执行闭包。 http://wiki.coldbox.org/wiki/WhatsNew:CacheBox-1.6.cfm#Get_Or_Set_Baby

另一种方法是缓存完整的HTML。为此,创建一个只为表单控件输出 HTML 的视图。创建一个事件,该事件 returns 只是该视图的输出,如下所示:

function stagesFormInput(event, rc, prc) cache=true {
  var stagesData = getmodel("tms_proposal_stage").select();
  return renderView(view="viewlets/stages", args={ stagesData : stagesData } );
}

请注意,我将 stageData 直接传递到视图中,因此它不会污染 rc 或 prc。此数据将在您的视图中作为“args.stagesData”提供。

还要注意方法声明中的“cache=true”。这就是告诉 ColdBox 缓存此事件的魔法(在 CacheBox 的 "template" 提供程序内)。您可以指定超时,但这将使用默认值。现在,在您的 [=46 中启用 eventCaching =].cfc 文件.

coldbox={
    eventCaching = true
}

http://wiki.coldbox.org/wiki/ConfigurationCFC.cfm#Application_Aspects

最后,在您的主视图或布局中,只需 运行 您希望输出缓存 HTML 的任何地方的新视图。

#runEvent("viewlets.stagesFormInput")#

这个设置有点多,但更强大,因为它缓存了完整的 HTML 片段,这非常理想。我还有一个完整的示例应用程序,可在工作应用程序中对此进行演示。你可以在这里查看: https://github.com/bdw429s/ColdBox-Viewlet-Sample