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