2016-10-27 2 views
2

У меня есть список продуктов и список категорий. Также у меня есть таблица сопоставлений product_categories, в которой говорится, что продукты подпадают под разные категории, а также в категории есть много продуктов. Здесь список категорий определяется администратором. Количество категорий фиксировано, но может варьироваться. Теперь мне нужно получить список продуктов, которые сопоставляются с категориямиНужны простые рельсы для многих логик ассоциации

product.rb 
has_many :product_categories, dependent: :destroy 
has_many :categories, through: :product_categories 

category.rb 
has_many :product_categories 
has_many :products, :through => :product_categories 

product_category.rb 
belongs_to :product 
belongs_to :category 

я написал код, как:

ProductCategory.joins(:category).map(&:category).uniq 

Есть ли способ, чтобы упростить эту линию?

+0

Нужен ли вам список категорий, в которых есть хотя бы один товар (например, в вашем коде), товар по категориям или в самих продуктах? – Vasfed

+0

да, мне нужен список категорий, имеющих хотя бы один продукт. Не счет. Мне нужна вся запись (ы) @Vasfed –

ответ

1

Чтобы получить список категорий, которые имеют продукты, которые вы можете использовать SQL inner join, который по умолчанию в рельсах.

Category.joins(:product_categories).distinct 
+0

Я думаю, что это ускорит выполнение, поскольку оно использует два объединения '(« SELECT DISTINCT »категории». * FROM 'category' INNER JOIN 'product_categories' ON 'product_categories'. 'Category_id' = 'categories'. 'Id' INNER JOIN 'domains' ON 'domains'. 'Id' = 'product_categories'. 'Product_id' ")', тогда как предыдущий использует только одно соединение '(" SELECT DISTINCT 'categories'. * FROM 'categories' INNER JOIN 'product_categories 'ON' product_categories '.' Category_id '=' categories '.' Id '")' –

1

Попробуйте это,

Category.joins(:products).distinct 
+0

Выполнение занимает больше времени, чем «Category.joins (: products) .distinct». Я проверил время выполнения. Для «Category.joins (: products) .distinct» требуется 5 мс, а для вашего запроса - 9 мс. Было бы лучше, если бы его можно было значительно сократить время выполнения. –

+0

Что вы хотите сказать? Category.joins (: products) .distinct занимает больше времени или меньше? – APS

+0

Это занимает больше времени. –

Смежные вопросы