Javascript Rails 4-在依赖选择上的急加载导致错误(Rails4/活动管理)

Javascript Rails 4-在依赖选择上的急加载导致错误(Rails4/活动管理),javascript,ruby-on-rails,ruby-on-rails-4,activeadmin,turbolinks,Javascript,Ruby On Rails,Ruby On Rails 4,Activeadmin,Turbolinks,我有一个活动面板,带有一个相关的选择,即第一个下拉菜单上的选择影响第二个下拉菜单中出现的内容 几个月前,一切都很顺利,但我昨天才意识到它已经不起作用了 我设法找到了错误的原因:如果我删除了急切加载(“包括”),那么它会再次工作。 不工作:(当前版本): @deal_subsectors = DealSector.find(params[:deal_sector_id], include: :deal_subsectors).dealsubsectors @deal_subsectors

我有一个活动面板,带有一个相关的选择,即第一个下拉菜单上的选择影响第二个下拉菜单中出现的内容

几个月前,一切都很顺利,但我昨天才意识到它已经不起作用了

我设法找到了错误的原因:如果我删除了急切加载(“包括”),那么它会再次工作。

不工作:(当前版本):

@deal_subsectors = DealSector.find(params[:deal_sector_id],
   include: :deal_subsectors).dealsubsectors
@deal_subsectors = DealSector.find(params[:deal_sector_id]).deal_subsectors
        // for edit page
        var deal_subsector = { };

       $(document).ready(function() {
         $('#deal_deal_sector_id').change(function() {
            update_deal_subsector();
         });
       });

       function update_deal_subsector() {
           deal_sector_id = $('#deal_deal_sector_id').val(); //get the value of sector id
           url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
          $.getJSON(url, function(deal_subsectors) {
              console.log(deal_subsectors);
                  $('#deal_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
              for( i = 0; i < deal_subsectors.length; i++) {
                 console.log(deal_subsectors[i]);
                 $('#deal_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
  };

          // for index page (filters)
          $(document).ready(function() {
              $('#q_deal_sector_id').change(function() {
                 update_deal_subsector_filter();
              });
              });

          function update_deal_subsector_filter() {
               deal_sector_id = $('#q_deal_sector_id').val(); //get the value of sector id
               url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
               $.getJSON(url, function(deal_subsectors) {
                      console.log(deal_subsectors);
                $('#q_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                 for( i = 0; i < deal_subsectors.length; i++) {
                     console.log(deal_subsectors[i]);
                     $('#q_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
        };
我得到了这个错误(从chrome开发工具的控制台)

工作,当我删除“include”/eager加载时:

@deal_subsectors = DealSector.find(params[:deal_sector_id],
   include: :deal_subsectors).dealsubsectors
@deal_subsectors = DealSector.find(params[:deal_sector_id]).deal_subsectors
        // for edit page
        var deal_subsector = { };

       $(document).ready(function() {
         $('#deal_deal_sector_id').change(function() {
            update_deal_subsector();
         });
       });

       function update_deal_subsector() {
           deal_sector_id = $('#deal_deal_sector_id').val(); //get the value of sector id
           url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
          $.getJSON(url, function(deal_subsectors) {
              console.log(deal_subsectors);
                  $('#deal_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
              for( i = 0; i < deal_subsectors.length; i++) {
                 console.log(deal_subsectors[i]);
                 $('#deal_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
  };

          // for index page (filters)
          $(document).ready(function() {
              $('#q_deal_sector_id').change(function() {
                 update_deal_subsector_filter();
              });
              });

          function update_deal_subsector_filter() {
               deal_sector_id = $('#q_deal_sector_id').val(); //get the value of sector id
               url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
               $.getJSON(url, function(deal_subsectors) {
                      console.log(deal_subsectors);
                $('#q_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                 for( i = 0; i < deal_subsectors.length; i++) {
                     console.log(deal_subsectors[i]);
                     $('#q_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
        };
在那种情况下,它工作得很好

但我真的很想加载处理子部门,所以我想知道是什么导致了这个错误,自从它工作以来发生了什么变化。我有一些假设,但找不到罪魁祸首

  • Rails 4是否改变了我应该使用find(params[:id]…)的方式,或者我应该使用eager加载的方式

  • 活动管理员是否改变了处理即时加载的方式:可能它只在索引上工作,而不在编辑页面上工作

  • 现在Rails 4上的TurboLink是否改变了我必须加载的方式

代码如下:

@deal_subsectors = DealSector.find(params[:deal_sector_id],
   include: :deal_subsectors).dealsubsectors
@deal_subsectors = DealSector.find(params[:deal_sector_id]).deal_subsectors
        // for edit page
        var deal_subsector = { };

       $(document).ready(function() {
         $('#deal_deal_sector_id').change(function() {
            update_deal_subsector();
         });
       });

       function update_deal_subsector() {
           deal_sector_id = $('#deal_deal_sector_id').val(); //get the value of sector id
           url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
          $.getJSON(url, function(deal_subsectors) {
              console.log(deal_subsectors);
                  $('#deal_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
              for( i = 0; i < deal_subsectors.length; i++) {
                 console.log(deal_subsectors[i]);
                 $('#deal_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
  };

          // for index page (filters)
          $(document).ready(function() {
              $('#q_deal_sector_id').change(function() {
                 update_deal_subsector_filter();
              });
              });

          function update_deal_subsector_filter() {
               deal_sector_id = $('#q_deal_sector_id').val(); //get the value of sector id
               url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
               $.getJSON(url, function(deal_subsectors) {
                      console.log(deal_subsectors);
                $('#q_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                 for( i = 0; i < deal_subsectors.length; i++) {
                     console.log(deal_subsectors[i]);
                     $('#q_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
        };
-在活动管理上

ActiveAdmin.register Deal do

# controller for the multi-select sector/subsector in the form
# does 2 things at same time: creates method and automatically defines the route of the method defined in controller
    if params[:deal_sector_id] # pass the id
      @deal_subsectors = DealSector.find(params[:deal_sector_id], include: :deal_subsectors).dealsubsectors
    else
      @deal_subsectors = []
    end

    render json: @deal_subsectors
  end   

end
-包含两个相关选项的表单

form do |f|

f.inputs "Client" do


      f.input :deal_sector_id,
        :label      => "Select industry:",
        :as         => :select,
        :prompt     => true,
        :collection => DealSector.order("name").all.to_a
      f.input :deal_subsector_id,
        :label      => "Select subindustry:",
        :as         => :select,
        :prompt     => true,
        :collection => DealSubsector.order("name").all.to_a        
    end

end
-为其提供动力的javascript:

@deal_subsectors = DealSector.find(params[:deal_sector_id],
   include: :deal_subsectors).dealsubsectors
@deal_subsectors = DealSector.find(params[:deal_sector_id]).deal_subsectors
        // for edit page
        var deal_subsector = { };

       $(document).ready(function() {
         $('#deal_deal_sector_id').change(function() {
            update_deal_subsector();
         });
       });

       function update_deal_subsector() {
           deal_sector_id = $('#deal_deal_sector_id').val(); //get the value of sector id
           url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
          $.getJSON(url, function(deal_subsectors) {
              console.log(deal_subsectors);
                  $('#deal_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
              for( i = 0; i < deal_subsectors.length; i++) {
                 console.log(deal_subsectors[i]);
                 $('#deal_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
  };

          // for index page (filters)
          $(document).ready(function() {
              $('#q_deal_sector_id').change(function() {
                 update_deal_subsector_filter();
              });
              });

          function update_deal_subsector_filter() {
               deal_sector_id = $('#q_deal_sector_id').val(); //get the value of sector id
               url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
               $.getJSON(url, function(deal_subsectors) {
                      console.log(deal_subsectors);
                $('#q_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                 for( i = 0; i < deal_subsectors.length; i++) {
                     console.log(deal_subsectors[i]);
                     $('#q_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
      };
    }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
        };
//用于编辑页面
var deal_subsector={};
$(文档).ready(函数(){
$('deal\u deal\u sector\u id')。更改(函数(){
更新_deal_subsector();
});
});
功能更新\交易\子部门(){
deal_sector_id=$('#deal_deal_sector_id').val()//获取扇区id的值
url='/admin/deals/deals\u subsectors\u by\u deal\u sector?deal\u sector\u id='+deal\u sector\u id;//查询将deal sector id作为参数传递给url的url
$.getJSON(url、函数(交易子部门){
console.log(交易分部门);
$('#deal_deal_subsector_id').html(“”//只需将id清空,如果扇区发生变化,则在再次填充之前将其清空
对于(i=0;i
添加的文件

class DealSector < ActiveRecord::Base
  has_many    :deal_subsectors
end

class DealSubsector < ActiveRecord::Base    
  belongs_to  :deal_sector,   :foreign_key => 'deal_sector_id'
end
class DealSector“交易部门\u id”
结束

当您调用
ActiveRecord::find
——这意味着您希望从DB获得一个单一的模型。 然后,您引用此模型并调用
dealsubsectors
——我假设它与您的模型有很多关系。它将产生两个查询:第一个是获取原始的
DealSelector
,第二个是所有相关的
DealSubsectors
。 没有什么可以优化的(除非
dealsubsectors
是模型中的自定义方法,而不是关系)


如果您看到某个查询击中了您的数据库,您必须查看其他位置。比如说,您的表单–每个表单是否只显示一个客户机?否则,它将迭代并为每个新客户机再次获取所有DealSector和DealSubsector。尝试提供更多代码。

为什么您不能只获取给定
扇区id的所有DealSubsector记录

DealSubsector.where(deal_sector_id: params[:deal_sector_id])

Rails 4在急切加载算法方面做了一些更改。 您可以在您的案例中尝试以下代码段:

@deal_subsectors = DealSector.eager_load(:deal_subsectors).find(params[:deal_sector_id]).dealsubsectors


第一个将在单个查询中获取数据,而第二个将进行两个查询

谢谢,但我不是说我用的东西不起作用。这非常有效:@deal\u subsectors=DealSector.find(params[:deal\u sector\u id])。deal\u subsectors但我想使用即时加载。是的,它有很多关系。当你说没有什么可以优化的时候,但我不认为这是真的:我认为egaer加载WXA就是要在一次调用中加载相关的资源,这样查询就更高效了。所以在这里我想用游戏扇区加载相关的子扇区。我将添加一些关于模型关系的代码。请告诉我您还需要哪些代码。使用此代码无法使用即时加载:
DealSector.find(params[:deal\u sector\u id])。deal\u subsectors
–您可以从控制台
(rails c)
运行它并查看查询。它将触发两个查询:查找
DealSector
和获取
DealSubsectors
。您必须考虑加载某些模型的其他位置–例如,在您的视图中。当然。我对这个问题的期望不是b