如何加速Rails中的动态选择4

时间:2015-05-17 01:46:09

标签: ruby-on-rails postgresql ruby-on-rails-4

我能够使用引用自身和jquery的相邻列表模型为省和城市创建动态下拉列表,但需要永远加载。

然而,它的工作原理是我希望它能够发挥作用;每次渲染表单时,此过程需要加载7473.4ms,因为我的位置表中有1718行,并且它尝试一次加载一个1718行。

我发现,使其加载的时间更长的是collective_collection_select,但我无法想到更快的替代方案。有没有查询调整,你可以建议我加快这个表单加载?

该模型如下所示:

class Location < ActiveRecord::Base
  has_many :books
  belongs_to :parent_location, class_name: Location
  has_many :child_locations, class_name: Location, foreign_key: "parent_id"
end

和db(位置表)看起来像这样,但它有1718行:

id  location         parent_id
1   Philippines 
2   Metro Manila        1
3   Abra                1
4   Caloocan City       2
5   City of Las Pinas   2
6   Pilar               3
7   Sallapadan          3

我可以使用&#34; collection_select&#34;进行动态下拉菜单。对于省份下拉菜单和&#34; grouped_collection_select&#34;对于我的_form.html.haml中的城市:

= f.collection_select :location_id, Location.where(parent_id: "1"), :id, :name, {prompt: "Select a Province"}, id: "province"
= f.grouped_collection_select :location_id, Location.all, :child_locations, :name, :id, :name, {prompt: "Select a City/Municipality"}, id: "city"

然后我使用jQuery在我的js.cofee文件中仅显示所选省份下的城市:

jQuery ->
    city = $('#city').html()
    $('#province').change->
        province = $('#province :selected').text()
        options = $(city).filter("optgroup[label='#{province}']").html()
        if options
            $('#city').html(options)
        else
            $('#city').empty()

1 个答案:

答案 0 :(得分:1)

我可以通过在grouped_collection中使用预加载来降低速度:

它预加载所有使加载时间更快的child_locations

 = f.grouped_collection_select :location_id, Location.preload(:child_locations), :child_locations, :name, :id, :name, {prompt: "Select a City/Municipality"}, id: "city"