情况如下:我有一个名为“Dashboard”的视图,其中包含一个简单的表单和一个“Draw Graphs”按钮。当我按下这个按钮时,我想制作两个ajax请求,它们将返回我的javascript所需的数据,以构建两个不同的图形。问题是两个请求都需要在我的数据库上执行完全相同的查询,我想避免重复查询。
我目前正在这样做的方法是让我的按钮触发一个ajax请求,该请求向mysql查询必要的数据,将该数据返回到我的ajax成功,然后将相同的数据作为params传递给另外两个ajax请求,然后使用数据生成绘制图形的必要结构。
它看起来像这样:
使用Javascript:
$('#draw_graphs').click(function() {
$.ajax({
url: 'single_query',
dataType: 'json',
data: $('#myForm').serialize(),
method: 'get'
}).success(function(activeRecord) {
ajax_graph1(activeRecord);
ajax_graph2(activeRecord);
});
});
ajax_graph1 = function(activeRecord) {
$.ajax({
url: 'create_g1',
dataType: 'json',
data: {active_record: activeRecord},
method: 'post'
}).success(function(g1) {
create_g1(g1);
});
};
ajax_graph2 = function(activeRecord) {
$.ajax({
url: 'create_g2',
dataType: 'json',
data: {active_record: activeRecord},
method: 'post'
}).success(function(g2) {
create_g2(g2);
});
};
滑轨:
def single_query
result = Data.where("etc... etc...")
respond_to do |format|
format.json { render json: result.to_json }
end
end
def create_g1
activerecord = params[:active_record]
graph1 = {}
activerecord.each do |ar|
#do whatever with graph1
end
respond_to do |format|
format.json { render json: graph1.to_json }
end
end
def create_g2
activerecord = params[:active_record]
graph2 = {}
activerecord.each do |ar|
#do whatever with graph2
end
respond_to do |format|
format.json { render json: graph1.to_json }
end
end
我遇到的问题是,显然你不能简单地将一个活动记录从控制器发送到javascript并再次返回控制器,结构似乎在路上发生了变化。虽然single_query
的{{1}}属于result
类,但当我将其传递到“javascript图层”时,它会转换为ActiveRecord_Relation
类
答案 0 :(得分:1)
你的推理是有道理的:只想打一次DB。问题是理解" javascript层"适用于Rails。 AJAX调用正在获取一个表示为JSON的XHR Response对象。这映射到Rails中active_record
的表示,但它肯定不是JS中对象的相同实例。
话虽这么说,你应该做你需要做的事情在Rails方面的记录,只需将响应发送到一个AJAX调用。在这种情况下,让您的$('#draw_graphs').click(
AJAX调用以相应的def draw_graphs
方法命中您的控制器。让该方法执行数据库调用,构建每个图并将两个图传回JSON哈希(下面)。然后在.success(function(graphs)
解析回复并将结果发送到您的2 ajax_graph
方法。
构建JSON哈希format.json { render json: { graph1.to_json, graph2.to_json } }
这里也有一些设计优化。你想拥有一个瘦控制器,所以要考虑 使用控制器清理/允许任何params进入result = Data.where(...)
。将这些参数传递给执行查询的类中的方法,并且可能有一个辅助方法来生成图形。看起来你甚至可以根据它正在构建的图表在该辅助方法中做一个case语句,因为create_g1
和create_g2
代码看起来很相似。同样,您也可以在JS中重构代码。