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

Rails: Send ActiveRecord received at ajax success as param to another ajax

本文关键字:ajax 参数 另一个 ActiveRecord 成功 Rails      更新时间:2023-09-26

情况是这样的:我有一个名为"仪表板"的视图,其中包含一个简单的表单和一个"绘制图形"按钮。当我按下这个按钮时,我想发出两个 ajax 请求,这些请求将返回我的 javascript 构建两个不同图形所需的数据。问题是两个请求都需要在我的数据库上执行完全相同的查询,我想避免重复查询。

我目前这样做的方法是让我的按钮触发一个 ajax 请求,该请求向 mysql 查询必要的数据,将该数据返回到我的 ajax 成功,然后将相同的数据作为参数传递给另外两个 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_queryresult是类ActiveRecord_Relation,但当我通过"javascript层"传递它时,它会转换为ActionController::Parameters

你的推理是有道理的:只想点击一次数据库。问题是理解"javascript层"如何与Rails一起工作。AJAX 调用正在获取表示为 JSON 的 XHR 响应对象。这映射到 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 } }

这里也有一些设计优化。您希望有一个瘦控制器,因此请考虑使用控制器来清理/允许任何参数进入result = Data.where(...)。将这些参数传递给执行查询的类中的方法,并且可能具有用于生成图形的帮助程序方法。看起来您甚至可以根据它正在构建的图形在该帮助程序方法中执行 case 语句,因为create_g1create_g2代码看起来相似。同样,您也可以在JS中重构代码。