grouped_collection_select用于动态菜单

时间:2013-08-08 20:19:15

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

我有一个填充产品选择的类别选择:

<%= f.collection_select(:category_id, Category.active.sorted, :id, :name, :include_blank => true ) %>

根据所选的类别,具有该category_id的产品将加载到下一个选择中:

<%= f.grouped_collection_select :product_id, Category.active.sorted, :products, :name, :id, :name, include_blank: true %>

两个问题:

  1. 我如何只显示有效范围的产品?即:Product.active

  2. 同样,在类别选择列表中,我如何仅显示附加了活动产品的类别?即:如果所选类别没有产品或产品不活跃,则类别不会显示在第一个下拉列表中。

  3. JS代码:

    $('#request_product_id').parent().hide()
    products = $('#request_product_id').html()
    emptyOption = $('<option />').attr('value', '');
    $('#request_category_id').change ->
        category = $('#request_category_id :selected').text()
        options = $(products).filter("optgroup[label='#{category}']").prepend(emptyOption).html()
        if options
            $('#request_product_id').html(options)
            $('#request_product_id').parent().show()
        else
            $('#request_product_id').empty()
            $('#request_product_id').parent().hide()
    

2 个答案:

答案 0 :(得分:0)

1)我如何仅展示具有活动范围的产品?

您是对的,您无需为产品定义范围,因此您可以使用.active轻松引用它。您希望在ProductsHelper文件中弹出类似的内容,以便您可以访问此类调用。

scope :active, lambda {|prod_id| where("active= ? AND id= ?", true, prod_id}

2)我如何仅显示附加了有效产品的类别?

我再次继续将范围附加到满足您需求的类别。但还有其他选择。 你可以尝试一些非常性感的课程方法,也一定能满足你的需求。这是一篇有趣的帖子Named Scopes are Dead

答案 1 :(得分:0)

我的观点:

第一

<强> product.rb

scope :active, -> {where(active: true)}

第二

<强> cateogry.rb

has_many :active_products, class: 'Product', :conditions => {:active => true}

然后你可以打电话:category.active_products