代码之家  ›  专栏  ›  技术社区  ›  Rubioli

filterrific gem-基于关联更新过滤器

  •  0
  • Rubioli  · 技术社区  · 6 年前

    在我的申请中,我有 Country , Region 和; City .

    class Country < ActiveRecord::Base
      has_many :cities
      has_many :regions
    
    
    class Region < ActiveRecord::Base
      belongs_to :country
      has_many :cities
    
    class City < ActiveRecord::Base
      belongs_to :country
      belongs_to :region
    

    这是我的模型,我有过滤器

    scope :with_country_id, lambda { |country_ids|
      where(:country_id => [*country_ids])
    }
    delegate :name, to: :country, prefix: true
    
    scope :with_region_id, lambda { |region_ids|
      where(:region_id => [*region_ids])
    }
    delegate :name, to: :region, prefix: true
    
    scope :with_city_id, lambda { |city_ids|
      where(:city_id => [*city_ids])
    }
    delegate :name, to: :city, prefix: true
    

    过滤器本身工作正常,但是当用户选择时,我是否能够使过滤器正常工作? country 我的 with_region_id 和; with_city_id ,也会根据它们的关联进行更新?

    例如,我有 国家:美国、英国 当用户选择 英国 , 具有地区标识 获取更新并仅显示属于的区域 英国 ,

    感谢您的帮助,并提前感谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rubioli    6 年前

    我使用动态菜单来解决这个问题:

    我改变了:

    = f.collection_select :with_country_id,@filterrific.select_options[:with_country_id]
    = f.collection_select :with_region_id,@filterrific.select_options[:with_region_id]
    

    到:

    = f.collection_select :with_country_id, Country.order(:name), :id, :name, {}, { class: 'class'}
    = f.grouped_collection_select :with_region_id, Country.order(:name), :regions, :name, :id, :name, include_blank: true
    

    JS :

    (function() {
    jQuery(function() {
        var regions;
    
        regions = $('#filterrific_with_region_id').html();
    
        if($('#filterrific_with_country_id option').is(':selected')){
            var country, escaped_country, options;
            country = $('#filterrific_with_country_id :selected').text();
            escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
            options = $(regions).filter("optgroup[label='" + escaped_country + "']").html();
    
            if (options) {
                $('#filterrific_with_region_id').html('<option value="">(Select one)</option>'+options);
    
            } else {
                $('#filterrific_with_region_id').html('<option value="">Please Select a Country</option>');
    
            }
    
            return $('#filterrific_with_country_id').change(function() {
                var country, escaped_country, options;
                country = $('#filterrific_with_country_id :selected').text();
                escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
                console.log(escaped_country);
                options = $(regions).filter("optgroup[label='" + escaped_country + "']").html();
                if (options) {
                    $('#filterrific_with_region_id').html('<option value="">(Select one)</option>'+options);
    
                } else {
                    $('#filterrific_with_region_id').html('<option value="">Please Select a Country</option>');
    
                }
            });
    
    
        } else {
            console.warn('NOT SELECTED');
    
            return $('#filterrific_with_country_id').change(function() {
                var country, escaped_country, options;
                country = $('#filterrific_with_country_id :selected').text();
                escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1');
                console.log(escaped_country);
                options = $(regions).filter("optgroup[label='" + escaped_country + "']").html();
                if (options) {
                    $('#filterrific_with_region_id').html('<option value="">(Select one)</option>'+options);
    
                } else {
                    $('#filterrific_with_region_id').html('<option value="">Please Select a Country</option>');
    
                }
            });
        }
    
    });