0

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

<%= 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. 如何仅显示具有活动范围的产品?IE:Product.active

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

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()
4

2 回答 2

0

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

你是对的,你不需要为 Products 定义一个范围,这样你就可以很容易地用 .active 引用它。您想在 ProductsHelper 文件中弹出类似这样的内容,以便您可以访问这样的调用。

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

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

再次,我将继续为满足您需求的类别附加范围。但是还有其他选择。您可以尝试一些非常性感的类方法,并且肯定也可以满足您的需求。这是一篇关于它的有趣帖子命名范围已死

于 2013-08-08T20:30:26.157 回答
0

我的观点:

第一个:

产品.rb

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

第二:

类别.rb

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

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

于 2013-08-08T20:43:04.590 回答