Найти все товары по тегам в Rails с ActiveRecord - PullRequest
1 голос
/ 14 января 2010

Возможно, это что-то очень простое, но я ищу оптимальный способ получения всех Продуктов по тегам, так сказать. Это с Spree, поэтому я должен придерживаться того, как они смоделировали свои данные. Это на самом деле Product и Taxon (например, категория, бренд и т. Д.)

Так что, если Product has_and_belongs_to_many :taxons и Taxon has_and_belongs_to_many :products, каков наилучший способ найти все продукты по Taxon?

Что-то вроде:

@taxon = Taxon.find_by_permalink('categories/')
@products = Product.find_by_taxon(@taxon)

... но я не уверен, что входит в этот последний метод (только что придумал название).

Ответы [ 5 ]

2 голосов
/ 14 января 2010

Возможно, вы просто скажете, есть ли только один таксон

@products = @taxon.products

Если есть несколько, нам нужен немного другой метод. Но даже тогда вы могли бы просто

@products = @taxons.inject([]) {|taxon| taxon.products}
2 голосов
/ 14 января 2010
@taxon = Taxon.find_by_permalink('categories', :include => :products) 

Это будет загружать продукты, чтобы вы могли получить к ним доступ через

@taxon.products

без повторного попадания в базу данных. Это более эффективная форма простого использования .products, позволяющая избежать проблем с N + 1 запросами.

0 голосов
/ 25 января 2017

Если вы хотите найти товар по его тегам, вы можете использовать tagged_with

Пример

Spree::Product.tagged_with("example")

Вернет товар с тегом "пример"

Источник: https://github.com/mbleigh/acts-as-taggable-on

0 голосов
/ 08 августа 2013

Мне удалось заставить это работать в Spree 2.1.0.beta со следующими настройками:

На основании ответа здесь: Поиск записей с двумя конкретными записями в другой таблице

Я добавил новую область продукта в /app/models/spree/product_decorator.rb

Spree::Product.class_eval do
  add_search_scope :in_all_taxons do |*taxons|
    taxons = get_taxons(taxons)
    id = arel_table[:id]
    joins(:taxons).where(spree_taxons: { id: taxons }).group(id).having(id.count.eq(taxons.size))
  end
end

Затем использовал новую область, добавив ее в /app/models/spree/base_decorator.rb

Spree::Core::Search::Base.class_eval do
    def get_base_scope
      base_scope = Spree::Product.active
      base_scope = base_scope.in_all_taxons(taxon) unless taxon.blank?
      base_scope = get_products_conditions_for(base_scope, keywords)
      base_scope = add_search_scopes(base_scope)
      base_scope
    end
end

Теперь я могу использовать стандартный помощник по поиску для поиска товаров (что означает, что я все еще могу указывать ключевые слова и т. Д. Вместе с несколькими таксонами):

# taxon_ids is an array of taxon ids
@searcher = build_searcher(params.merge(:taxon => taxon_ids))
@products = @searcher.retrieve_products

Это работает для меня и чувствуется довольно безболезненно. Тем не менее, я открыт для лучших вариантов.

0 голосов
/ 14 января 2010

Не будет Taxon.find_by_permalink('categories/').products достаточно?

РЕДАКТИРОВАТЬ: Да, и для нескольких таксонов вы можете попробовать что-то вроде этого:

Product.find(:all, :include => :products_taxons, :conditions => { :products_taxons => {:taxon_id => [1,2,3]} }) # will find products with taxons with id 1, 2 or 3
...