Rails:将ajax成功收到的ActiveRecord作为另一个ajax的param发送

时间:2016-02-23 21:36:34

标签: javascript ruby-on-rails ajax

情况如下:我有一个名为“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

1 个答案:

答案 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_g1create_g2代码看起来很相似。同样,您也可以在JS中重构代码。