Как отобразить все категории для отрасли, которая имеет подкатегории в grouped_collection_select в Rails - PullRequest
0 голосов
/ 23 марта 2019

У меня три модели. Промышленность, категория продукта и категория продукта. И связь между ними такова:

class Industry
  has_many :product_categories
end

class ProductCategory
  belongs_to :industry, optional: true
  has_many :product_sub_categories
end

class ProductSubCategory
  belongs_to :product_category
end

И я показываю на выбор:

<div class="form-group">
  <%= f.label :product_category %>
  <%= f.grouped_collection_select :product_category_id, Industry.all, 
    :product_categories, :name, :id, :name, { selected: 
     @product.product_category_id }, { class: "form-control form-
     control-alt", required: true } %>
 </div>

Но это работает не так, как я хочу. Он отображает все категории продуктов в каждой отрасли, но я просто хочу отображать только те категории продуктов, которые имеют подкатегории.

1 Ответ

1 голос
/ 23 марта 2019

Ваш вопрос состоит из двух частей:

1.Выбор категорий с подкатегориями.

Если у вас много данных - лучше использовать счетчик кэша - добавить product_sub_categories_count столбец к категориям, установить counter_cache:true на own_to и вызвать ProductCategory.reset_counters(id, :product_sub_categories) для каждого идентификатора категории после миграции для заполнения.

А затем:

scope :with_subcategories, ->{ where('product_sub_categories_count > 0') }

Другим простым решением для небольших наборов данных является вычисление этого во время выполнения:

scope :with_subcategories, ->{
  joins(:product_sub_categories).group(:id).select("product_categories.*, count(*) as product_sub_categories_count").
  having('product_sub_categories_count > 0')
}

2.Используя это в grouped_collection_select

Когда у нас есть область действия - это становится проще:

class Industry
  ...
  has_many :product_categories_with_subcategories, ->{ with_subcategories }
end

f.grouped_collection_select :product_category_id, Industry.all, 
  :product_categories_with_subcategories, :name, :id, :name,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...