我正在向我的控制器操作中的一个发出AJAX请求,该操作负责为javascript函数提供JSON服务,而javascript函数则根据我视图中的数据生成svg。
但是,我正在处理的数据也需要在视图内的一个表中表示,而且我不希望该查询必须多次针对数据库运行,所以我想知道是否可以只对页面的初始请求执行查询,然后使用params散列下的AJAX将其传递给我的其他控制器?
为了简化这个问题,这里概述了当前的工作流程:
页面请求->查询->视图服务-> AJAX GET请求->查询->生成SVG
我想要的:
页面请求->查询->视图服务-> AJAX GET请求->生成SVG
我以为我可以简单地在AJAX请求中将关系作为param传递,但是它不是将关系作为ActiveRecord::Relation传递,而是将其作为字符串传递:
"#<ActiveRecord::Relation:0x00000009137fc8>":String
我还尝试将其存储到会话中,例如:
session[:foo] = @bar
但我遇到了以下错误信息,这使我相信会话不能存储关系?
无法使用默认的proc转储哈希
这种工作流程的首选解决方案是什么?
发布于 2012-12-06 13:59:32
ActiveRecord::Relation
是一个内部Rails对象,它不是JavaScript的“外部世界”所知道的东西。(理论上,您可以序列化它,然后反序列化它.但这只是个坏主意:-)。所以不,这不是正确的方法。您可以在会话中保存对象本身(查询的结果,而不是ActiveRecord::Relation),尽管这通常不是很好的实践。
那么,你如何才能实现你想要的呢?
首先,Rails倾向于缓存大多数数据库查询,因此在进行优化之前,请确保需要对其进行优化。
假设是这样的话,您似乎要做两件事情:显示查询的结果,然后发出生成SVG的不同请求( AJAX请求)。这两种方法不是完全不同的(很明显,在某些方面是相关的),但在形式上是不同的,在不同的时间运行。这将提出两种不同的方法。
如果它们非常接近--也就是说,您在第一个视图中拥有您所需的90%,那么您也可以在第一个视图中添加一个隐藏字段或未显示的值,在JS中激发AJAX查询页面(DOM)以获取生成SVG所需的值。
在某些情况下,我看到人们在HTML中使用data-
属性以更结构化的形式保存属性值,这种形式很容易通过JS访问,从而有效地将完整的对象序列化为HTML中未显示的数据。
但在进行此操作之前,请确保正在优化需要优化的内容:-)
发布于 2013-12-15 06:09:19
你可以这样做:
变量关系= '<%= @criteria.where_values_hash.to_json.html_safe %>‘
然后,可以在"data“中的ajax请求中发送此关系var。
https://stackoverflow.com/questions/13752198
复制