我有一个填充产品选择的类别选择:
<%= 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 %>
我如何只显示有效范围的产品?即:Product.active
同样,在类别选择列表中,我如何仅显示附加了活动产品的类别?即:如果所选类别没有产品或产品不活跃,则类别不会显示在第一个下拉列表中。
$('#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()
答案 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