0

我正在向我的一个控制器操作发出 AJAX 获取请求,该控制器操作负责将 JSON 提供给一个 javascript 函数,该函数又根据我的视图内的数据生成一个 svg。

但是,我正在使用的数据也需要在视图内的表中表示,并且我不希望查询必须多次针对数据库运行,所以我想知道是否可以只执行对页面的初始请求的查询,然后在参数哈希下使用 AJAX 将其传递给我的另一个控制器?

为了简化问题,这里概述了当前的工作流程:

页面请求 -> 查询 -> 查看服务 -> AJAX GET 请求 -> 查询 -> 生成 SVG

我想要的是:

页面请求 -> 查询 -> 查看服务 -> AJAX GET 请求 -> 生成 SVG

我想我可以简单地将关系作为 AJAX 请求中的参数传递,而不是将关系作为 ActiveRecord::Relation 传递,而是将其作为字符串传递:

"#<ActiveRecord::Relation:0x00000009137fc8>":String

我还尝试将其存储到会话中,例如:

session[:foo] = @bar

但是我遇到了以下错误消息,这使我相信会话不能存储关系?

无法使用默认 proc 转储哈希

这种工作流程的首选解决方案是什么?

4

2 回答 2

1

ActiveRecord::Relation是一个内部 Rails 对象,它不是 JavaScript 的“外部世界”所知道的。(理论上,你可以序列化它,然后反序列化它......但这只是一个坏主意:-)。所以不,这不是正确的方法。您可以在会话中保存对象本身(查询的结果,而不是 ActiveRecord::Relation),尽管这通常不是好的做法。

那么如何才能实现你想要的呢?

首先,Rails 倾向于缓存大多数数据库查询,因此在优化某些内容之前,请确保它需要优化。

假设确实如此,您似乎在做两件事:显示查询结果,然后发出不同的请求(AJAX 请求)来生成 SVG。这两种方法不是完全不同的吗(嗯,显然在某些方面相关),但形式不同,并且在不同的时间运行。这将提出两种不同的方法。

如果它们真的很接近——也就是说,你在第一个视图中有 90% 的内容,那么你也可以在第一个视图中添加一个隐藏字段或未显示的值,并在触发 AJAX 查询的 JS 中生成 SVG 所需的值的页面 (DOM)。

在某些情况下,我看到人们使用data-HTML 中的属性以更结构化的形式保存属性值,这种形式可以通过 JS 轻松访问,从而有效地将完整对象序列化为 HTML 中未显示的数据。

但在你这样做之前,请确保你正在优化需要优化的东西:-)

于 2012-12-06T21:59:32.490 回答
0

you can do this :

var relation = '<%= @criteria.where_values_hash.to_json.html_safe %>'

Then you can send this relation var in the ajax request in "data"

于 2013-12-15T14:09:19.163 回答